当用户进程需要读数据到Buffer Cache时,或Cache Buffer根据LRU算法进行管理时,就不可避免地要扫描LRU List获取可用Buffer状态,我们知道,Oracle的Buffer Cache是共享内存,可为众多并发进程并发访问,所以在搜索的过程中必须获取Latch(Latch是Oracle的一种串行锁机制,用于保护共享内存),锁定内存结构,防止并发访问损坏内存中的数据。
用于锁定LRU的Latch就是经常见到的Cache Buffers Lru Chain。
SQL> col name for a25
SQL> select addr,latch#,name,gets,misses,immediate_gets,immediate_misses
2 from v$latch where name='cache buffers lru chain';
ADDR LATCH# NAME GETS MISSES IMMEDIATE_GETS IMMEDIATE_MISSES
-------- ---------- ------------------------- ------ ------ -------------- -----
05DB0BC8 139 cache buffers lru chain 45648 22 58492 92
Cache Buffers Lru Chain Latch存在多个子Latch,其数量受隐含参数_db_block_lru_latches控制
SQL> select x.ksppinm,y.ksppstvl value,x.ksppdesc describ from
2 x$ksppi x,x$ksppcv y where x.inst_id=userenv('Instance')
3 and y.inst_id=userenv('Instance')
4 and x.indx=y.indx
5 and x.ksppinm like '%&par%';
输入 par 的值: db_block_lru_latches
原值 5: and x.ksppinm like '%&par%'
新值 5: and x.ksppinm like '%db_block_lru_latches%'
KSPPINM VALUE DESCRIB
------------------------------
_db_block_lru_latches 8 number of lru latches
SQL> select addr,child#,name,gets,misses,immediate_gets igets,immediate_misses
2 imisses from v$latch_children where name ='cache buffers lru chain';
ADDR CHILD# NAME GETS MISSES IGETS IMISSE
S
-------- ---------- ------------------------- ------ ------ ---------- ---------
-
2DDD0FBC 8 cache buffers lru chain 28 0 1 0
2DDD0C0C 7 cache buffers lru chain 28 0 1 0
2DDD085C 6 cache buffers lru chain 28 0 1 0
2DDD04AC 5 cache buffers lru chain 28 0 1 0
2DDD00FC 4 cache buffers lru chain 28 0 1 0
2DDCFD4C 3 cache buffers lru chain 45876 22 58506 9 2
2DDCF99C 2 cache buffers lru chain 195 0 151 0
2DDCF5EC 1 cache buffers lru chain 28 0 1 0
已选择8行。
如果该Latch竞争激烈,通常有如下方法可以采用
1.适当增加Buffer Cache,这样可以减少读数据到Buffer Cache的机会,减少扫描LRU List的竞争
2.可以适当的增加LRU Latch的数量,修改_db_block_lru_latches参数可以实现,但是该参数通常来说是足够的。
3.通过多缓冲技术,可以减少不希望的数据老化和全表扫描等操作对于Default池的冲击,从而可以减少竞争。
阅读(1323) | 评论(0) | 转发(0) |