1. 首页
  2. IT资讯

关于非簇索引中存储的簇索引的RID还是指针的问题

昨晚遇到了阿少,这小子又换了马甲,差点认不出,他现在正在做数据存储这块,也就是想自己做个存储引擎,所以对MSSQL的存储这块研究的比较深入,他提出了关于非簇索引中存储的是簇索引的RID还是指针的问题,他坚持说是存储的一个指针,就是指向簇索引中数据的指针,我查了一晚上资料,本来这几天事情很多,精力不集中,而且有点头疼,索引看了很久才看到了点信息,具体总结如下:
1、如果一个表上有两个索引,一个是簇索引,另一个是非簇索引,那么非簇索引中除了存储键值外,还存储簇索引的键值,通过非簇索引查找数据时,要先获取非簇的键值,然后获取簇的键值,因为他们在非簇里是存储在一起的,然后通过簇索引的键值,在到簇索引的根节点,然后一级级的查下去,直到簇索引叶子节点的相应的数据,这样,非簇索引里不存储簇索引数据行的RID,而是存储的簇索引的键值,虽然在查找簇索引的数据时多走几个节点,然而,在维护非簇索引时可能要省不少劲,因为这牵扯到簇索引节点分裂时非簇索引的维护问题。
2、另一点让我感到惭愧的是,虽然接触数据库这么多年,基本理论也看过一点,然而对堆的理解还是那么肤浅,甚至认为索引也是一个堆,通过和阿少讨论,加深了我对堆概念的理解,所谓堆就是当一行新插入表时,需要获取空间来容纳新插入数据,那么这个空间在堆里任何一个地方都可以,只要能放开新插入的数据就可以,而索引不同,它必须把新插入行的键值插入到该插入的位置才可以,因为索引里的键值的排列是有顺序的。
3、此外,阿少还提到,在簇索引中,当分裂页时,新插入行以后的所有地址即RID都要一次向后挪动,也就是都要改变RID,我的思考,不需要一次向后挪动,因为索引的页是双向链表,只需在链表中加入新的页就可以了,需要改动RID的数据行只涉及到新添加到链表里的页,而其他数据页的数据并未挪动,因此RID也并没发生变化,但即使如此,在页分裂时,包括分支节点和叶节点的工作量,也是比较大的,对维护费簇索引来说也是不少的开销,尤其是对那些经常发生改变的簇索引来说。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8484829/viewspace-605584/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:深沉的少年,转转请注明出处:http://www.cxybcw.com/184798.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code