【DB笔试面试681】在Oracle中,什么是块清除(Block Cleanout)?

【DB笔试面试681】在Oracle中,什么是块清除(Block Cleanout)?

♣  

题目         部分

在Oracle中,什么是块清除(Block Cleanout)?


     


♣  

答案部分          


块清除(Block Cleanout)是指清除存储在数据块头部与锁相关的信息,其实质是在清除块上的事务信息,包括数据的行级锁和ITL信息(包括提交标志、SCN等),块清除不需要生成Redo日志。Oracle的块清除有两种:快速块清除(Fast Commit Cleanout)和延时块清除(Delayed Block Cleanout)。

通过命令“alter system dump undo header '回滚段名称';”可以将Undo段头信息dump出来,可以很明显地看到事务表(TRN TBL)信息,其中,状态(state)为10代表活动事务,状态(state)为9表示INACTIVE。Dba列表示该事务对应的Undo Block Dba地址。

每个事务处理只分配给一个Undo段,一个Undo段可以同时服务多个事务处理。UPDATE事务的内部流程如下所示:

① 首先当一个事务开始时,需要在Undo段事务表上分配一个事务槽。

② 在数据块头部获取一个ITL事务槽,该事务槽指向Undo段头的事务槽。

③ 在修改数据之前,需要记录前镜像(Before Image)信息,这个信息以Undo Record的形式存储在回滚段中,回滚段头事务槽指向该记录。

④ 锁定修改行,修改行锁定位(lb-lock byte)指向ITL事务槽。

⑤ 进行数据修改。

在提交事务的时候,如果被修改过的数据块仍然在Buffer Cache之中,那么Oracle可以清除ITL信息,这叫作快速块清除(Fast Block Cleanout),也叫提交清除(Fast Commit Cleanout)。快速块清除还有一个限制,当修改的块数量超过Buffer Cache约10%,则对超出部分不再进行快速块清除。

在提交事务的时候,如果被修改过的数据块已经被写回到数据文件上(或大量修改超出Buffer Cache的10%的部分),再次读出该数据块进行修改,显然成本过于高昂,对于这种情况,Oracle选择延迟块清除(Delayed Block Cleanout),即在提交的时候只会清理Undo Segment Header中的事务表信息,而Data Block上的事务标志不会清除,等到下一次访问该Block时再来清除ITL锁定信息,这就是延迟块清除。Oracle通过延迟块清除来提高数据库性能,加快提交操作。如果Oracle不对块完成这种延迟清除,那么COMMIT的处理可能会很长,COMMIT必须重新访问每一个块,可能还要从磁盘将块再次读入内存。在一个OLTP系统中,可能很少看到这种情况发生,因为OLTP系统的特点是事务都很短小,只会影响为数不多的一些块。

如果执行一个大的INSERT、UPDATE或DELETE,会影响数据库中的许多块,那么就有可能在此之后,第一个“接触”块的查询会做延迟块清除,从而生成Redo日志,所以,SELECT语句也有可能会产生Redo日志。

如果有如下的操作,那么可能会受到块清除的影响:

l 将大量新数据批量加载到数据仓库中;

l 在刚刚加载的所有数据上运行UPDATE(产生需要清理的块);

l 让别人查询这些数据

因此,建议在批量加载了数据后,通过运行DBMS_STATS实用程序来收集统计信息,就能自然的完成块清除工作。Oracle提供了一个内部事件(10203事件)可以用来跟踪数据库的块清除操作,可以通过以下命令设置:

1ALTER SYSTEM SET EVENTS '10203 trace name context forever';

 


上一篇:mysql事务--InnoDB存储引擎事务


下一篇:基于undo log多版本链条实现的ReadView机制,到底是什么?