enq: KO - fast object checkpoint 等待事件与 direct path read - 2

本文探讨了Oracle数据库中_adaptive_direct_read特性如何影响表扫描操作,并解释了当表大小超过_small_table_threshold阈值时,如何触发fast object checkpoint,导致enq:KO-fast object checkpoint等待事件的发生。
   查询发现等待事件 enq: KO - fast object checkpoint 发生的原因是:当进行TABLE FULL SCAN (全表扫描) 或并行查询整个segment时, 11g下,因_adaptive_direct_read 默认为true,  达到阀值_small_table_threshold大小的表会被认为是大表,读取数据时不会读入SGA , 而是直接路径读取(direct path read),而direct path read 是需要将数据从磁盘读取到各session 的PGA中,因为不是读入SGA, 所以读取这些表之前需要在所有数据库节点(如果是RAC)触发object level checkpoint,将这些表被修改过的dirty buffer写入磁盘,以保证读取数据的一致性 。 

SQL> select ksppinm, ksppstvl from x$ksppi pi, x$ksppcv cv   where cv.indx = pi.indx and pi.ksppinm like '_adaptive_direct_read';
KSPPINM                  KSPPSTVL
---------               ---------------------
_adaptive_direct_read    TRUE

SQL> select ksppinm, ksppstvl from x$ksppi pi, x$ksppcv cv   where cv.indx = pi.indx and pi.ksppinm like '_small_table_threshold';

KSPPINM                  KSPPSTVL
---------               ---------------------
_small_table_threshold    15083     -- (单位为blocks,每个版本对应值貌似都不同)

  查询SQL执行计划 :   
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('5jctyad1z1s6a',0,'all iostats last'));  
或 
select * from  table(dbms_xplan.display_awr('5jctyad1z1s6a')) ; 

发现有四个表做全表扫描,这几个表的大小(block数目)显然大于设置的_small_table_threshold阀值,所以走了direct path read, 读取数据到PGA之前需要触发object level checkpoint去将这四个表在buffer cache中的dirty buffer写入磁盘,等待checkpoint完成。相当于 ckpt 或 dbwr 阻塞了读(读入到SGA)。这时,enq: KO - fast object checkpoint  等待事件发生。 如果发生这种等待事件,一个简单的查询可能也会变得非常慢。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-1387117/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-1387117/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值