Latch: enqueue hash chains
@H_502_16@
Latch: cache buffer chains
当数据块被读入SGA的时候,块头(buffer headers)通过一定的算法(mod(dba,_db_block_hash_buckets))被归于不同的hash buckets,然后被hash chains串联起来,Oracle 8i以前每个hash bucket被一个cache buffers chains latch(hash latch,cbc latch)保护,从Oracle 8i开始多个hash buckets被一个cache buffers chains latch保护,Oracle系统中这些对象的数量可以通过如下这些查询得到:
cache buffers chains latch的数量:
1.select count(distinct hladdr) from x$bh;
2.select count(*) from v$latch_children where name='cache buffers chains';
3.select ksppstvl from x$ksppi t1,x$ksppcv t2 where t1.indx=t2.indx and lower(t1.ksppinm)='_db_block_hash_latches';
hash bucket的数量:
1.select ksppstvl from x$ksppi t1,x$ksppcv t2 where t1.indx=t2.indx and lower(t1.ksppinm)='_db_block_hash_buckets';
hash chain的数量与hash bucket的数量相等
当多个进程需要存取被同一条hash chain保护的buffer headers的时候,系统就会出现cache buffers chains latch等待事件,形成这个等待事件主要有两个方面的原因:
1、热点块:
多个进程同时存储相对集中的数据块,需要从几个方面来着手解决这个问题:
(1)调整效率低下的sql语句,降低需要读取的数据块数
(2)将相对集中的数据打散,使其分散于更多数量的数据块中,解决方法和buffer busy waits等待事件中的类似
(3)调整隐藏参数_spin_count,增加进程成功获取latch的可能性,这个方法要慎用,增大_spin_count会增加cpu的负荷从而可能造成负面效果
2、hash chain太长:
如果一条hash chain比其他hash chain长,它所管理的buffer header更多,那么发生cache buffers chains latch等待的几率就更大,针对这个问题,可以通过增加hash bucket的数量进而影响hash chain的数量来达到缩短hash chain的目的
library cache latch
1.
来源:
http://blog.itpub.net/471666/viewspace-615638/
http://www.tuicool.com/articles/m6VBZb 绑定变量与非绑定变量资源消耗对比