每个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上去。也就是说,当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。
SYS@ prod>select name from v$latch_children where name like '%buffers lru%' and gets != 0;
NAME
----------------------------------------------------------------
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
cache buffers lru chain
8 rows selected。
SYS@ prod>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#;
---------- ---------- -------------------- ---------- ----------
8 rows selected.
总结:buffer cache中有pool,每个pool中至少有8个Latch:cache buffers lru chain,每个Latch:cache buffers lru chain对应着一个working set,每个working set中,有多个CBC LATCH来,每个CBC LATCH管理着多个hash bucket,每个hash bucket对应着一条hash chain。
数据块在读入buffer cache中时,同时会在buffer cache中构造一个buffer header,ORACLE对数据块的DBA进行hash运算,根据运算结果将buffer header挂载到相应的hash chain上。
同时,每个working set中,有一对LRU和LRUW链表,buffer cache中的数据块,胜块会挂载到LRUW链表,其它块在LRU链表。也就是buffer cache中的数据块,肯定在LRU和LRUW链表之一:不能同时存在这两个链表上。
2.6:现在再回过头,看看怎样查找BUFFER
(Y)
1)
Block
2)定位到对应的Hash
1.比较Buffer
3.如果Buffer
4.若发现Block地址符合的Buffer
5.如果lock
6.搜索完整个Hash
Buffer
(可以参照v$bh的STATUS)
1.free
2.xcurrent=已EXCLUSIVE方式获取的当前模式的block(insert,update,delete时产生),scurrent=可以与其他instance共享的当前模式block
3.cr=一致读块,永远不会写入disk
4.reading=正从disk读取出来的块
5.mreciver=正在进行介质恢复的block
6.ircovery=正在进行instance
3)
Header中的Buffer地址到Buffer
2.7:
如果上面在Hash
(N)
再看看前面给的BUFFER
1)
2)
3)
所以,当前面查找数据在BUFFER
总的在BUFFER
通常有2中情况或导致Latch出现竞争:
1)
2)
如果出现Cache
1)
块(可以关注X$BH中的TCH字段)。
2)
3)
如果出现Cache
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21598700/viewspace-1115147/ ,如需转载,请注明出处,否则将追究法律责任。