源于csdn论坛的一个提问:
通过一个查询看下扫描的数据页:
可以看到,该查询全部数据是扫了四个数据页,也就是说插入的四行数据,一行为一个page.
但是我们执行下面的sql,发现index_size为8k:
这是为什么,为什么没有建索引,这里却有一个index_size 8k ?
下面来看看index_size是怎么来的?
首先想到是的
通过查看sp_spaceused的代码,我们找到对于我们这个查询有用的信息代码:
通过上面的代码,我们可以基于我们目前的这个情况(堆表,不含有xml和fulltext,所以上面的202/204那段不用管了)提练出index的page如下算法:
这个结果是1.再套上index_size的公式:
这就是8k的算法,从下面联机文档上关于in_row_data_page_count
对于这两列,联机文档解释是:
in_row_used_page_count
用于存储和管理分区中的行内数据的总页数。该计数包括非叶 B 树页、IAM 页以及 in_row_data_page_count 列包含的全部页。
in_row_data_page_count
分区中存储行内数据所用的页数。如果分区是堆的一部分,则该值为堆中的数据页数。如果分区是索引的一部分,则该值为叶级别中的页数。(未计入 B 树中非叶页的数目。)以上两种情况都未计入 IAM(索引分配映射)页。
针对我们目前该表的情况,仅是一个堆表,那么可知前者是包含了IAM页,而后者不含有IAM页,那么sp_spaceused中的index_size在这里就是一个IAM(索引分配映射)页。
其实这个也可以通过DBCC IND看到:
如有错误,欢迎指正。