作者:民柱自由人士不只是剑客 | 来源:互联网 | 2017-05-12 15:07
oracle有一个modifiedblocklist结构,用来记录每个transaction更改过的block,每个transaction大约可以记录10%buffercache这多
oracle有一个modified block list结构,用来记录每个transaction更改过的block,每个transaction大约可以记录10%buffer cache这多
一. Block Cleanout 说明
之前的相关测试参考:
Orace ITL(Interested Transaction List) 说明
OracleBlock scn/commit scn/cleanout scn 说明
block clean out 是指把一个块中的数据从 dirty 变为 clean,等于告诉后面的人,这个块里面的数据是干净的,可以放心的使用,本质上是更改 block header 中的一个标志位。
当commit 的时候,如果被commit 的数据块还在 data buffer 中也要被cleanout,因为 commit 的时候并不一定修改block header (delay block cleanout) 。
Clean out有2种: fast commitcleanout和delayed blockcleanout:
Oracle有一个modified block list结构,用来记录每个transaction更改过的block,每个transaction大约可以记录10%buffer cache这多的modified block。这部分block就是当发生commit的时候,oracle可以根据modified block list定位到那些块并做fast commit cleanout。
如果一个transaction修改的块超过10%buffer cache,那么超过的块就执行delayed block cleanout。当做fast commit cleanout时,oracle不会清理 Row lockslb标志位,ITL lck标志位。
另一种情况是delayed block cleanout,,当transaction还未commit或rollback时modified block已经被写回磁盘,当发生commit时oracle并不会把block重新读入做cleanout,这样成本太高.而是把cleanout留到下一次对此块的访问(select,update)时完成。
当delayed cleanout时候如果undo segment header的transaction table slot还没有被覆盖,那么可以找回该事务递交的exact scn,如果slot已经被覆盖(ITL被覆盖),那么将会使用undo segment header中的control scn来做为upper bound scn。
当发生fast commit cleanout,系统将transaction提交时刻的scn作为commit scn,更新block上 itl和undo segment header的Transaction table的slot上的 scn,并修改block scn,三者是一致的。
发生delayed block cleanout的时候,之前的transaction commit更新的只是undo segment header Transactiontable 上的slot scn,而并未做block上的更新,等待下次使用此block的时候,更新block scn和itl状态。block scn和itl的更新又分2种情况:
(1)当不产生slot重用的时候, delayedblock cleanout时,根据Transactiontable里面的信息,更新blockscn和itl上的Scn/Fsc为transaction曾经提交时候的scn。
(2)当产生slot重用的时候,更新对应itl上scn为undo segment 上的control scn,而block scn 为delayed block cleanout发生时刻的scn。