注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 Cisco IOS下载
 帮助

数据库rowid实现问题


2008-03-03 11:25:40
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://happytest.blog.51cto.com/324097/63915
在实现位图索引的时候,出现了一些问题,引发出对rowid的一些思考。
位图索引的目的就是对于重复值较多的字段,如果通过B树索引,可能要不断的进行比较操作,而使用位图索引,则可以通过按位操作直接定位到满足条件的记录上,这样位图索引对于每个关键字的值都应该有一个位图,通过按位操作,找到记录的rowid,然后通过rowid就可以直接定位到对应的记录。
但是在达梦数据库实现的时候,rowid并不是和记录的物理位置相关联的,而只是系统中的一个唯一值而已,这样如果使用rowid的话,则找到rowid之后还需要一次聚簇索引查找操作,效率上就大打折扣了。
鉴于此,查看了一下ORACLE的rowid,ORACLE的rowid是直接和记录的物理位置相关联的,其组成为:data_object_id#+rfile#+block#+row#组成,占用10个bytes的空间, 32bit的 data_object_id#,10 bit 的 rfile#,22bit 的 block#,16 bit 的 row#. 这样ORACLE在实现位图索引的时候,可以很容易的通过rowid定位到记录的物理位置。
达梦在实现位图索引的时候,也考虑考虑修改rowid,将其改为具体的物理位置,这样一来带来了另外一个问题,达梦创建表的时候会默认的建立聚簇索引,聚簇索引的叶子节点存储了实际的记录,这样在对表进行一些更新、删除、插入操作的时候,记录的物理位置可能发生变化,那么位图索引中响应的物理位置的值也需要跟随着变化。
试验了一下ORACLE的rowid,在对表进行更新、删除、插入操作的时候,记录的rowid并不会发生变化,因此可以反推,ORACLE是不是没有建立聚簇索引,而是将记录分开存放的?这样在插入、更新、删除的时候,其物理位置并没有发生改变?这样来实现应该也是有其一定的道理的,聚簇的概念就是将相关的记录尽可能的在物理上连续存放,这样在读取的时候可以减少很多的IO操作,而将记录在物理上连续存放也是需要付出一定的代价的,即记录可能在做更新操作的时候位置被挪动,从而带来一定的开销,因此用户应该根据自己的需要在确实需要聚簇的时候来使用聚簇存储。
但是达梦数据库则默认的就创建了聚簇索引,这从一定程度上加快了记录的存取速度,但是不可避免的也带来了一部分的额外开销。
不知有没有高手来解答一下ORACLE的rowid在聚簇的时候到底是如何处理的?是否也可能发生变化?

本文出自 “越测越开心” 博客,请务必保留此出处http://happytest.blog.51cto.com/324097/63915





    文章评论
 
2008-03-03 11:27:21
高手来帮助看看

2008-03-03 17:15:53
刚看到一篇文章说了ORACLE的block的组织方式,原来当做更新操作的时候,如果发现空间不够的话,可能会将数据放到另外一个block中,然后通过一直指针链过去,这样rowid就不会改变了。例如有一个字段类型为VARCHAR(500),开始插入一个字符a,插入200条这样的记录,数据库中肯定只用了一个字节来保存a,如果将第一条记录更新为500个a的话,那会发现这个block中肯定没有空间可以用了,那么将数据保存到后面空闲的block中,然用一个指针指过去,这样第一条记录的rowid就不会改变了,虽然值的位置不同了。

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: