暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

数据块延迟清除

原创 落荃 云和恩墨 2022-12-01
1078

什么是延迟数据块清除

存储在区块中的事务数据,需要在事务提交后清除TX行锁和ITL(事务槽)。Cleanout有2种,一种是fast commit cleanout(提交清除),另一种是delayed block cleanout(延迟清除)。

ITL描述

ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag,lck和scn/fsc组成,用来记录该块所有发生的事务,一个itl可以看作是一条事务记录。当然,如果这个事务已经提交,那么这个itl的位置就可以被反复使用了,因为itl类似记录,所以,有的时候也叫itl槽位。如果一个事务一直没有提交,那么,这个事务将一直占用一个itl槽位,itl里面记录了事务信息,回滚段的入口,事务类型等等。如果这个事务已经提交,那么,itl槽位中还保存的有这个事务提交时候的SCN号。

ITL个数其最小值为1,由参数initrans控制(由于兼容性的原因,oracle会在对象的存储块分配两个itl,所以initrans的最小值实际上为2),最大值为255,由参数maxtrans控制,最大值参数在10g以后不能被修改,itl是block级的概念,一个itl占用块46B的空间,参数initrans意味着块中除去block header外一部分存储空间无法被记录使用(46B*initrans),当块中还有一定的free space时,oracle可以使用free space构建itl供事务使用,如果没有了free space,那么,这个块因为不能分配新的itl,所以就可能发生itl等待。
如果在并发量特别大的系统中,最好分配足够的itl个数,其实它并浪费不了太多的空间,或者,设置足够的pctfree,保证itl能扩展,但是pctfree有可能是被行数据给消耗掉的,如update,所以,也有可能导致块内部的空间不够而导致itl等待。

fast commit cleanout (提交清除):修改的块列表

为了能够在提交时快速进行区块清理,事务必须清除哪些区块做了修改。oracle中使用block list状态对象来记录被修改的区块;block list包含了20 个不同块的条目。每个条目包含:


  • 当前 TX锁 中的保存点编号
  • 当前 TX锁的事务槽索引
  • 指向相关缓存块标头的指针

delayed block cleanout(延迟清除)

设想在一个涉及较大量数据的DML操作下,因为执行时间较长,一部分已修改的块已被写入数据文件,当事务完成需要COMMIT操作时,那些已经被写入的块无法被标记为commit,则需要将那些已写至磁盘的数据块重新读入,这将消耗大量I/O,并使COMMIT操作十分缓慢。所以为了解决这个问题,Oracle不清除

(1)在更新过程中,被缓冲池flush out写至磁盘的块

(2)更新操作涉及的块超过了块缓冲区缓存的10%时,超出的部分块

而是选择在下一次操作访问到这些块时需要在读入后完成块清除,这样的操作称之为块延迟清除(deferred block cleanout);

块延迟清除通过事务槽上的回滚段号,槽号等信息访问回滚段头的事务字典,若事务不再活跃或事务过期则完成清除块上的事务槽,事务槽清除后继续执行相应的操作。

(1)快速块清除(fast block cleanout), 当事务修改的数据块全部保存在buffer cache 并且修改数据块的数据量没有超过 cache buffer 的 10%,快速清除事务信息。
(2)延迟块清除(delayed block cleanout) 当修改的数据块的阀值超过10% 或者本次事务相关的数据块已经被刷出了buffer cache, oracle 会下次访问此block 时再清除事务信息。



(PS:图片来自于网络)

参考案例文章已上传。







「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论