减少索引维护开销的多版本管理方法

文档序号:9432736阅读:470来源:国知局
减少索引维护开销的多版本管理方法【
技术领域
】[0001]本发明涉及一种减少索引维护开销的多版本管理方法,属于数据库管理
技术领域
。【
背景技术
】[0002]数据库的并发控制,其目的是在多个用户同时存取同一个数据对象时,协调这些操作,保证数据的一致性。比如一个账户的余额是100,用户a读取余额,增加10元,写入新则值为110。在用户a读取账户余额后,用户b也读取该余额,为100元,他增加20元,在用户a写入110元后,用户b写入120元。最终余额为120元,这是一个错误的值。正确的值应该为130元。并发控制的目的,就是协调上述用户对数据的操作,保证数据的一致性。[0003]并发控制方法有两类,一类是加锁机制,事务(用户发起的任务)在读取数据之前,加读锁(ReadLock),在写入数据之前加写锁(WriteLock)。如果数据上已经有读锁,可以在其上加新的读锁,但是不能加写锁。如果数据上已经有写锁,则新的写锁和读锁都不能加在数据上。通过加锁,可以实现不同用户对同一数据对象的操作。并发控制的另外一类技术是多版本管理,读事务读取最近的某个数据对象的提交版本,而写事务则写入一个新版本,等到事务提交的时候,新版本成为新的最近提交的版本,固化下来。多版本管理机制,解除了读写事务之间的冲突,有利于提高系统的并发度,即同一时间执行的事务的数量,或者吞吐能力。但是需要付出版本管理的空间开销,在目前存储空间富裕的情况下,这个代价是值得的。[0004]现有的多版本管理方法,一般在数据库表格文件中存放记录的不同版本,这些版本用链表链接起来。如果这个数据库表格有若干个索引,比如基于用户ID字段的索引、基于日期字段的索引等,这些索引一般采用B+树形式,支持事务处理,以及支持点查询和范围查询。索引树的叶子节点通过记录ID(RowID)连接到数据文件的具体记录,然后通过链表可以访问数据的所有的版本。[0005]如果一个表格拥有若干索引,对表格进行数据增删改的时候,这些索引都需要进行维护,即进行相应的修改,需要付出时间开销,从而降低系统的事务吞吐能力。【
发明内容】[0006]本发明针对上述问题的不足,提出一种减少索引维护开销的多版本管理方法,该方法简化了索引的维护开销,提高事务处理的吞吐量。[0007]本发明为解决上述技术问题提出的技术方案是:[0008]—种减少索引维护开销的多版本管理方法,在数据库表格中存放记录的不同版本,数据库系统提取存放记录的物理ID;所述数据库表格中设有一个以上的索引,赋予每个记录一个逻辑ID,索引的叶子节点保存记录的逻辑ID;建立逻辑ID到物理ID的映射表,同时维护逻辑ID到物理ID的映射表:[0009]当更新一个记录的时候,在数据库表格中生成新的一个记录,链表指向新记录的物理ID;同时,映射表做相应的更新,把更新前相应的记录的逻辑ID映射到新记录的物理ID;[0010]当一个记录被删除,映射表里的该记录对应的逻辑ID到物理ID的映射条目被删除;在进行索引扫描时,通过索引找到具体的数据记录,由于映射表没有这样的映射,所以删除的记录将不被检索到;而索引叶节点上的无效的逻辑ID可以在访问该索引的时候,再进行删除;对于删除以后,就从来没有被访问过的记录,需要一个脱机的处理过程,统一地把索引里面,没有出现在映射表中的逻辑ID全部删除掉;[0011]当增加一个记录的时候,记录增加到数据库表格的末尾,数据库系统提取其物理ID,同时对该记录赋予一个新的逻辑ID,该物理ID和新的逻辑ID进行关联,加入到映射表;除了更新映射表的条目,所有的索引都需要用新的逻辑ID进行更新;[0012]在进行索引扫描的时候,通过索引访问数据库表格时,需要根据映射表,把逻辑ID转换成物理ID,然后根据物理ID找到其对应的记录;如果物理ID为空、或者映射表没有该逻辑ID的条目,则表明某个记录已经被删除,扫描过程忽略这样的记录即可。[0013]所述索引包括基于用户ID字段的索引、基于日期字段的索引。[0014]优选的:所述索引采用B+树形式;所述B+树的阶数为k(K〉=3),树形结构的内部节点包括分割键值key和指向子节点的指针。[0015]优选的:所述映射表中记录逻辑ID、最近提交的版本的物理ID、最近未提交的版本的物理ID、下一个历史提交版本的指针。[0016]优选的:所述映射表带有一个辅助数据结构,以链条的方式保存记录的历史提交版本。[0017]优选的:对当前已经提交的版本读写数据的方法:[0018]对当前已经提交的版本读数据的时候,在当前已经提交的版本上加读锁,当前提交版本通过从映射表的最近已经提交版本物理ID进行提取即可,该ID可以直接用于找到记录的确切的物理位置;[0019]对当前已经提交的版本写数据的时候,对当前已经提交的版本上加写锁,生成新的一个未提交的版本;[0020]对当前已经提交的版本确认写入,进行事务收尾工作时,首先对记录施加一个确认锁,只需把写锁进行升级就可以了;[0021]事务提交时,新提交的记录版本成为最近提交的版本,所有的读锁、写锁释放掉,历史提交版本被迀移到历史版本缓冲区,缓冲区需要保存记录的物理ID和链接关系,新提交的记录版本保存在数据文件中。[0022]本发明的一种减少索引维护开销的多版本管理方法,相比现有技术,具有以下有益效果:[0023](I)利用记录的逻辑ID到物理ID的映射关系,把索引和记录的物理表示进行解耦(Decouple),简化对数据库表格进行增删改等操作时,需要对索引进行的维护操作,从而提高事务处理的吞吐量。[0024](2)围绕上述映射关系设计的并发控制方法,不仅提供了读取未提交数据(Uncommitted)、读取提交数据(Committed)、可以重复读(RepeatableRead)等重要的事务隔离级别,而且通过解除读事务和写事务的等待关系(在加锁机制中,一个事务对数据进行与入,另外一个事务是不能进行读取的),极大提尚事务吞吐能力。。【附图说明】[0025]图1是本发明B+树的结构示意图;[0026]图2为本发明映射关系不意图;[0027]其中,空白圆圈表示逻辑ID,横纹圆圈表示物理ID(最近提交),竖纹圆圈表示物理ID(最近未提交),斜纹圆圈、反斜纹圆圈表示各历史提交版本。而方形则表示数据文件里的具体的记录。【具体实施方式】[0028]附图非限制性地公开了本发明一个优选实施例的结构示意图,以下将结合附图详细地说明本发明的技术方案。[0029]实施例[0030]—种减少索引维护开销的多版本管理方法,在数据库表格中存放记录的不同版本,数据库系统提取存放记录的物理ID;所述数据库表格中设有一个以上的索引,赋予每个记录一个逻辑ID,索引的叶子节点保存记录的逻辑ID;所述索引包括基于用户ID字段的索引、基于日期字段的索引。所述索引采用B+树形式;所述B+树的阶数为K(K〉=3),树形结构的内部节点包括分割键值key和指向子节点的指针。建立逻辑ID到物理ID的映射表,同时维护逻辑ID到物理ID的映射表。所述映射表中记录逻辑ID、最近提交的版本的物理ID、最近未提交的版本的物理ID、下一个历史提交版本的指针。所述映射表带有一个辅助数据结构,以链条的方式保存记录的历史提交版本。[0031]当更新一个记录的时候,在数据库表格中生成新的一个记录,链表内得到新记录的物理ID;同时,映射表做相应的更新,把更新前相应的记录的逻辑ID映射到新记录的物理ID;[0032]当一个记录被删除,映射表里的该记录对应的逻辑ID到物理ID的映射条目被删除;在进行索引扫描时,通过索引找到具体的数据记录,由于映射表没有这样的映射,所以删除的记录将不被检索到;而索引叶节点上的无效的逻辑ID可以在访问该索引的时候,再进行删除;对于删除以后,就从来没有被访问过的记录,需要一个脱机的处理过程,统一地把索引里面,没有出现在映射表中的逻辑ID全部删除掉;[0033]当增加一个记录的时候,记录增加到数据库表格的末尾,数据库系统提取其物理ID,同时对该记录赋予一个新的逻辑ID,该物理ID和新的逻辑ID进行关联,加入到映射表;除了更新映射表的条目,所有的索引都需要用新的逻辑ID进行更新;[0034]在进行索引扫描的时候,通过索引访问数据库表格时,需要根据映射表,把逻辑ID转换成物理ID,然后根据物理ID找到其对应的记录;如果物理ID为空、或者映射表没有该逻辑ID的条目,则表明某个记录已经被删除,扫描过程忽略这样的记录即可。[0035]对当前已经提交的版本读写数据的方法:[0036]对当前已经提交的版本读数据的时候,在当前已经提交的版本上加读锁,当前提交版本通过从映射表的最近已经提交版本物理ID进行提取即可,该ID可以直接用于找到记录的确切的物理位置;[0037]对当前已经提交的版本写数据的时候,对当前已经提交的版本上加写锁,生成新的一个未提交的版本;[0038]对当前已经提交的版本确认写入,进行事务收尾工作时,首先对记录施加一个确认锁,只需把写锁进行升级就可以了;[0039]事务提交时,新提交的记录版本成为最近提交的版本,所有的读锁、写锁释放掉,历史提交版本被迀移到历史版本缓冲区,缓冲区需要保存记录的物理ID和链接关系,新提交的记录版本保存在数据文件中。[0040]本发明的创新点在于,赋予每个记录一个逻辑ID,索引的叶子节点保存记录的逻辑ID,我们同时维护一个记录的逻辑ID到物理ID的映射表。这个映射关系大大简化了索引的维护开销,我们同时给出基于该映射关系的多版本并发控制机制,提供事务的正确执行方法。[0041]我们所采用的索引的数据结构基于普通的当前第1页1 2 
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1