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