1.working set与Latch:cache buffers lru chain:
每个working set都具有它自己的一组LRU和LRUW链表(LRU和LRUW链表总是成对出现的)。
ORACLE为了提高buffer cache性能(大内存),使用了多个working set
每个working set都由一个名为“Latch:cache buffers lru chain”的latch来保护,每一个lru latch对应一个working set。
而每个被加载到buffer cache的buffer header都以轮询的方式挂到working set(包含的LRU链表)上去--。
而每个被加载到buffer cache的buffer header都以轮询的方式挂到working set上去。也就是说,当buffer cache加载一个新的数据块时,其对应的buffer header会去找一个可用的lru latch,如果没有找到,则再找下一个lru latch,直到找到为止。如果轮询完所有的lru latch也没能找到可用的lru latch,该进程只有等待latch free等待事件,同时出现在v$session_wait中,并增加“latch misses”。
如果启用了多个DBWR后台进程的话,每个DBWR进程都会对应一个不同的working set,而且每个DBWR只会处理分配给它的working set,不会处理其他的working set。
2.cache buffers lru chain LATCH的个数:
ORACLE默认创建的cache buffers lru chain LATCH数量与CPU个数、DBWR个数相关。
DBWR小于4,个数为:4*CPU个数
DBWR大于4,个数为:DBWR*CPU个数
每个buffer pool使用自己的cache buffers lru chain LATCH,一个数据库实例可以配置:DEFAULT,2KB,4KB,8KB,16KB,32KB,KEEP,RECYCLE 这8种类型的buffer pool,故cache buffers lru chain LATCH的数量最少为8个。详见:
点击打开链接
或使用以下语句查出buffer cache中各个pool中cache buffers lru chain LATCH的获取情况: --语句来自周亮《ORACLE DBA实战攻略》
SYS@ bys3>select d.blk_size,c.child#,p.bp_name,c.gets,c.sleeps from x$kcbwds d,v$latch_children c,x$kcbwbpd p where d.set_latch=c.addr and d.set_id between p.bp_lo_sid and p.bp_hi_sid order by c.child#;
BLK_SIZE CHILD# BP_NAME GETS SLEEPS
---------- ---------- -------------------- ---------- ----------
8192 1 KEEP 18 0
8192 3 RECYCLE 18 0
8192 5 DEFAULT 864096 144
2048 7 DEFAULT 18 0
4096 9 DEFAULT 18 0
8192 11 DEFAULT 18 0
16384 13 DEFAULT 18 0
32768 15 DEFAULT 18 0
在我的虚拟机中,CPU是一个,在10G中是有8个LRU LATCH,在11GR2中,是16个LRU LATCH.见:javascript:void(0)
3.cache buffers lru chain LATCH在什么情况下需要使用:
数据块读入buffer cache前需要获得cache buffers lru chain LATCH--因为要到LRU上找空闲buffer
DBWR扫描LRUW链表前需要获得cache buffers lru chain LATCH
SMON将空闲buffer移动至LRU辅助列,也需要cache buffers lru chain LATCH。
4.cache buffers lru chain LATCH在哪些情况下出现争用:
简单说就是多个进程同时检索LRU/LRUW时出现。
具体情况有: --物理读过多引起争用概念高。
多个会话并发访问不同表或索引,因为这样发生物理读可能较大--由上面可知物理读时需要在LRU找空闲buffer
脏块过多,DBWR写出慢(DBWR的性能不足-主机性能问题,或者磁盘I/O),涉及DBWR调优-在此不多讨论。
注:CBC LATCH主要发生在逻辑读时-多会话并发访问相同的表或索引-相同表或索引多集中于几条相同hash chain。