ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于非簇索引中存储的簇索引的RID还是指针的问题

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

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

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

请登录后发表评论 登录
全部评论

注册时间:2008-06-27

  • 博文量
    244
  • 访问量
    499161