探究一下索引

42次阅读

共计 837 个字符,预计需要花费 3 分钟才能阅读完成。

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

图下次补上

正文完
 0