cache buffer 相关的闩锁等待事件(cache buffers lru chain/cache buffers chain)
cache buffers lru chain
原因
高负荷的cache吞吐量,效率差的sql语句(全表扫描,或不正确的index range scans)
dbwr写出速度太慢,前台进程花费很多时间持有latch查找free buffer。
cache buffers lru chain保护buffer的链表在cache中,当增加,移除,移动一个buffer从list时,cblc latch必须被获取。
在SMP(对称多处理)的系统上,oracle自动设置LRU latche数量是cpu个数的一半。
在有很多处理器的系统里,对cblc latch的争用会影响性能,LRU latch争用可以被通过查询V$LATCH, V$SESSION_EVENT, V$SYSTEM_EVENT等视图识别问题。
为了避免争用,考虑优化应用,绕过buffer cache对于batch,dss任务,或者重新设计应用。
cache buffers chains
cbc latch用来保护buffer cache中的buffer 链表,
当在链表中搜索,增加,移除buffer时就需要获取cbc latch。
cbc latch的争用通常是由于某个buffer频繁被使用。
如果特定的子latch在与其它子latch比较后有很多的gets,MISSES, SLEEPS。
获取该latch的内存地址,通过V$LATCH_CHILDREN.ADDR与X$BH去关联,就能找到特定的热块。
SELECT OBJ data_object_id, FILE#, DBABLK,CLASS, STATE, TCH
FROM X$BH
WHERE HLADDR = 'address of latch'
ORDER BY TCH;
X$BH.TCH是一个接触计数器,tch高表明这是个热块。
一个latch会保护很多块,这些块中间的某个块可能就是热块,一个高tch值的块将是一个潜在的热块。执行如下查询多次
识别出多次出现的块,查询DBA_EXTENT得到块所在的segment。
SELECT OBJECT_NAME, SUBOBJECT_NAME
FROM DBA_OBJECTS
WHERE DATA_OBJECT_ID = &obj;