oracle延迟块清除,Oracle Study之案例--延迟块清除(deferred block cleanout)

场景一:会话一更新一小表,更新的block数小于db_block_buffers*10%,当会话一进行commit时,更新的block还存在于buffer cache中。由于更新的块数较少,Oracle采用SO(state block)列表来管理更新块。SO主要包括了更新块的事物状态信息。当会话一进行提交时,会从SO列表中获取更新块的事物信息,从而进行更新块的事物信息清理。清理主要包括块头itl状态列的更新(Flag,Lck ,Scn/Fsc)和行锁标记的清理。Oracle对于这种块清理称之为快速块清理。(Fast Block Cleanout)。发生延迟块清除后,块头的Flag往往显示如下:Itl              Xid                             Uba                              Flag Lck Scn/Fsc0x01 0x0009.01f.0000bed8 0x04c00016.13bf.28 --U- 3 fsc 0x0000.063f1a51其中U表示upper bound(上界),意味着快速块清除。场景二:会话一更新一大表,更新的blocks数大于db_block_buffers*10%,当会话一进行commit前,部分更新的block由于种种原因已经刷新至至数据文件。当会话进行commit时,Oracle对存在于SO列表的更新块进行快速块清理,同时更新undo segment head中的事物槽(将事物槽state标记从10置回9,表示该事务已经提交)。但需要注意的是,Oracle在commit时,并不会处理已刷新在数据文件中的block(此时数据块头还flag标记仍然显示未提交状态,Lck依然显示该块中行锁的行数,Scn/Fsc为空,行锁标记依然为lb: 0x2)。Oracle采用此方进行提交时,并不需要再次将该事务涉及到的block从物理文件中读取,而只需要进行快速块清理和更新undo segment head中的事物槽即可。从而保证提交的性能最优化。当有另一会话再次读取已刷新至数据文件的block时,如果发现此block itl列表有未提交事物时,那么Oralce将进行延迟块清除(defered block cleanout)。当进行延迟块清除时,Oracle将获取数据块中未提交事物的xid中的seq和undo segment head中事物槽的seq进行比较。如例子所示,数据块的ITL显示如下:ITL Xid Uba Flag Lck Scn/Fsc0x01 0x0009.018.0000bdd4 0x04c00016.13a5.32 C-U- 0 scn 0x0a00.063f08380x02 0x0009.01f.0000bed8 0x04c00016.13bf.28 ---- 3 fsc 0x0000.00000000undo segment head的和此事物相关的事物槽显示如下:index state cflags wrap# uel scn dba---------------------------------------------------------------0x1f 9 0x00 0xbed8 0xffff 0x0a00.063f1a51 0x04c00016undo segment head的事物控制列表如下:TRN CTL:: seq: 0x13c0 chd: 0x002d ctl: 0x001f inc: 0x00000000 nfb: 0x0000mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)uba: 0x04c0000d.13c0.04 scn: 0x0a00.063f17f1事物控制列表中scn主要表示事物槽被覆盖前的scn。如上所示ITL 0x02中有未提交事物,那么首先会获取0x02事物中xid(回滚段为0x0009,事物槽为0x01f,seq为 0000bed8)和undo segment head对应事物槽比较(主要比较xid.seq和事物槽的wrap#)。如果两者相等,那么进行延迟块清除时,Oracle将获取事物槽中的scn写往ITL列表中的Scn/Fsc列。如果两者不相等,这里分为两种情况:1、undo的事物槽被其他事物覆盖,那么进行延迟块清除时,Oracle将获取undo segment head的事物控制列表的scn写往ITL列表中的Scn/Fsc列。这里需要注意的是,此时的scn并不是事物提交时的真正scn,而且肯定比事物提交时的scn大,那这样会不会影响事物一致性呢,接下来例子会进行说明。2、undo表空间被删除,此时undo$并不会将此表空间删除,只会将STATUS$从2改为1,而且每个undo segment依然保留着最近一次提交的scn。如下所示SQL> select SCNBAS,SCNWRP,STATUS$,file#,name from undo$;SCNBAS SCNWRP STATUS$ FILE# NAME---------- ---------- ---------- ---------- ------------------------------258954408 2560 1 13 _SYSSMU127$258954399 2560 1 13 _SYSSMU128$258954395 2560 1 13 _SYSSMU129$258954404 2560 1 13 _SYSSMU130$那么进行延迟块清除时,Oracle会去undo$中对获取对应的undo segment中的scn写往ITL列表中的Scn/Fsc列。同样需要注意的是,此时的scn并不一定事物提交时的真正scn,可能会比提交的scn大。发生延迟块清除后,块头的Flag往往显示如下:ITL Xid Uba Flag Lck Scn/Fsc0x01 0x0009.018.0000bdd4 0x04c00016.13a5.32 C-U- 0 scn 0x0a00.063f0838其中C表示该事物已结束,U表示Upper bound(上界),C-U-往往表示延迟块清除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值