理解SQLServer中的聚合索引
说到一个聚集索引,我想每个代码都能理解,但也有很多像我这样的程序员,只能用死记硬背来解决这个问题,什么表只能建立一个聚集索引,然后拉目录搜索帮助读者记忆……问题就在这里。我们不是在学文科。我们不需要记住,但我们需要的是看在眼里的真实的东西。我们都喜欢收集的指标,因为它可以把堆表为秩序的无序列表,播放B树。这样,复杂度降低,从N到LogMN。所以逻辑读取,物理读取。
第一:现象
1:非索引案例
例如,作为旧规则,首先我有一个没有索引的产品表,如下所示:
从上面,我看到了一个悲剧,物理读9次,是去了9次硬盘,你也可以想一想,去努力的目的是获取数据,逻辑读1636次,应该指出的是,这是第一页,是记忆了1636根据页号码,我给你在DBCC IND一看,有1636页的数据表。
这里有1637个数据页的原因是第一个是IAM跟踪页面。
2:有一个聚合索引。
接下来,我在产品表中建立product_idx_productid聚集索引,然后看IO情况再次,如下:
当你看到这个逻辑读到3遍时,你已经疯了,在1636个数据页中找到目标数据只有3次,这是一个盲目的算术神吗
当然了,这个,天空,世界也有…既然有,就要有很强的探索欲望。看看这是怎么回事吧。
二:勘探原则
1:探索叶节点
正如我刚才所说的,聚集索引正在播放B树。由于它是B树,所以有叶节点和分支节点。叶节点的专业术语为0度,> 0称为分支节点。
我想您也听说过聚集索引正在对索引列数据进行排序并将其放入B树中。为了让你的眼睛看到真相,我首先建立一个ID无序3记录。
复制代码代码如下所示:
DBCC TRACEON(3604)
DBCC页(携程、1120,1)
然后我使用DBCC IND命令查看其中的数据页3个记录,如:
从图中可以看到,我的三条记录在148号页面上,然后导出148号页面,看看内容是什么。
复制代码代码如下所示:
DBCC TRACEON(3604)
DBCC页(携程、1173,1)
从上面的图表中,我们可以看到数据页中的每个槽都是根据表中的实际存储记录来指示的。好的,现在我创建一个聚集索引来查看实际的数据是否是有序的。
复制代码代码如下所示:
创建群集的人ctrip_idx_id指数(ID)
但这里有一个有趣的问题。我的数据页在哪148页还可以得到索引页173。为了确保数据完整性,我们应该将第148页的内容添加到173索引页中。检查它。
复制代码代码如下所示:
DBCC TRACEON(3604)
DBCC页(携程、1173,1)
通过上面的地图有直觉感吗数据现在是aaaaa,bbbbb,模式ccccc。它的秩序。同时,148号的数据也存储在索引页
这页字段的值,如身份证、姓名信息,采取以下slot0槽为例:
到目前为止,我认为您对叶子节点的内容有了大致的了解,至少不会把它记住给您。
2:探索分支节点
为了让您看到分支节点,我必须在它中添加更多的数据,并且无论如何,让数据断开索引数据页,以便分支节点的索引页退出,并查看下面的示例。
从图中可以看到,当我插入1000个数据时,有一个分支节点(索引120索引页),三个叶节点(173121126),叶子。
我已经说过了节点的数据页的内容,现在我很好奇分支节点中存储了什么我好兴奋。我要导出120号索引数据页面。
复制代码代码如下所示:
DBCC TRACEON(3604)
DBCC页(携程、1120,1)
对slot0:06000000 00ad0000 000100内容的简单分析
00000000:叶索引页中的最小键值(这里有一点特殊,除了一行记录不保存最小值,其余都是),转换为十进制数为0。
ad000000:叶子的索引页的页号,转换为十进制为173。
0100:叶索引页的文件号,转换为十进制是1。
但通过分析,我们可以看到,事实上,在分支节点两个值,一个是childpage Minkey,一是childpage pageid,同其他插槽的位置是正确的。
我们改变参数命令使结果更直,并记录保存pageid和Minkey。
在这种情况下,我脑海中有一张照片。我不知道你现在有没有
通过以上分析,除了第一行记录不保存子索引页中的最小键值外,所有其他记录都是在子索引页中提取最小索引键值的,应该注意到。
也许对SQLServer的团队,只要判断是小于449的,直接去(1:173)数据页,小于889的直接(1:121)数据页。
当您看到这一点时,您不知道您是否知道表中为什么只有一个聚集索引好的,迪克,我希望能帮助你。