1.现在有一张表,数据量约20w
2.使用DBCC IND ( dbname, [dbo.tablename], -1)打印出索引的具体情况,导入DBCCResult表。

几个重要字段:    PageType   :1-数据页面  2-索引页面      3-Lob_mixed_page 4-Lob_tree_page 10-IAM页面     IndexID    :0-代表堆   1-代表聚集索引  2-250 代表非聚集索引 大于250就是text或image字段     IndexLevel  :0-叶节点   >=2 中间节点,最大的为根节点     PageId         :索引页id     FileId         :索引所在文件ID统计结果:    `select * from DBCCResult where PageType = 2 and IndexID = 1;`       37个聚集索引节点    (7656个叶节点,即数据页,未包括在里面(PageType=1) 36个中间节点,1个根)      `select * from DBCCResult where PageType = 2 and IndexID = 2;`     1076个非聚集索引节点 (1067个叶节点 8个中间节点 1个根)

3.使用DBCC PAGE ('dbname',file number,page number,print option = [0|1|2|3])打印每一页的情况

  • DBCC PAGE([dbname],4,3808,3)取到一个聚集索引的叶节点(即数据页面),得到里面有26行记录,估算一下,26*7656 共约20万条记录
  • DBCC PAGE([dbname],5,31,3)取到一个非聚集索引的叶节点,得到里面有192行记录,估算一下,192*1076 共约20万条记录

为什么非聚集索引叶节点的记录要多这么多?
聚集索引叶节点(即数据页面)存放的是一行的记录。估算一下一个页8k/26 = 315 字节,约等于表一行的大小。
非聚集索引叶节点存放的是指针。估算一下一个页8k/192 = 42 字节,好像有点问题,一个指针不是4个字节?这个指针中包含的内容是 非聚集索引的键 + 主键,以此来定位聚集索引的位置。

图下次补上