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个字节?这个指针中包含的内容是 非聚集索引的键 + 主键,以此来定位聚集索引的位置。
图下次补上