全部博文(389)
分类: Oracle
2016-04-06 22:41:26
Oracle Direct Path Read和Fast Object Checkpoint
ORACLE使用Direct Path Read(以下简称DPR)的原因主要是防止物理读对buffer cache的泛
洪,所以一般情况下很少使用这种方式来读取数据,常见的原因有表大于buffer cache的5%,
并行,对temporary段的读等.第一种方式我在以前的文章中有介绍,感兴趣的朋友可以参考相关的
链接.
ORACLE在做DPR之前会对将要执行的对像做一次对像级别的checkpoint,因为direct path read
读取的数据是直接从物理磁盘中读取的,所以需要保证物理磁盘中数据是最新的.比如磁盘中数
据块的版本是T1,而数据块在buffer cache中经过修改后的版本是T2,在T3的时候会话A发布一个DPR,
这个时候把所有在buffer cache中该对像小于T3的块都要写到磁盘上,使会话A读取到的数据是一
个最新的版本.
当使用对像级别的checkpoint,就需要请求enqueue来进行保护,防止多个会话同时发布该会话
在ORACLE中就会出现 enq: KO - fast object checkpoint,我们做10046跟踪时可以发现该等待事件经
常位于DPR事件之前.
WAIT #139797776941200: nam='enq: KO - fast object checkpoint' ela= 6586 name|mode=1263468550 2=65596 0=1 obj#=-1 tim=511462571686
WAIT #139797776941200: nam='direct path read' ela= 172 file number=1 first dba=100049 block cnt=15 obj#=93511 tim=511462572413
WAIT #139797776941200: nam='direct path read' ela= 116 file number=1 first dba=100064 block cnt=16 obj#=93511 tim=511462572600
WAIT #139797776941200: nam='direct path read' ela= 48 file number=1 first dba=100080 block cnt=16 obj#=93511 tim=511462572767
WAIT #139797776941200: nam='direct path read' ela= 41 file number=1 first dba=101504 block cnt=16 obj#=93511 tim=511462572870
所以我们在AWR中看到DPR事件经常也会伴随着'enq: KO - fast object checkpoint'等待事件的出现.