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

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

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

转载于:http://blog.itpub.net/8484829/viewspace-605584/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值