等待事件 latch:cache buffers chains
原理:
當(dāng)一個數(shù)據(jù)塊讀入到sga中時,該塊的塊頭(buffer header)會放置在一個hash bucket的鏈表(hashchain)中。
該內(nèi)存結(jié)構(gòu)由一系列cache buffers chains子latch保護(hù)(又名hash latch或者cbc latch)。對Buffer cache中的塊,
要select或者update、insert,delete等,都得先獲得cache buffers chains子latch,以保證對chain的排他訪問。
若在過程中發(fā)生爭用,就會等待latch:cache buffers chains事件。
產(chǎn)生原因:
?
1. 低效率的SQL語句(主要體現(xiàn)在邏輯讀過高)
在某些環(huán)境中,應(yīng)用程序打開執(zhí)行相同的低效率SQL語句的多個并發(fā)會話,這些SQL語句都設(shè)法得到相同的數(shù)據(jù)集,
每次執(zhí)行都帶有高 BUFFER_GETS(邏輯讀取)的SQL語句是主要的原因。相反,較小的邏輯讀意味著較少的latch get操作,
從而減少鎖存器爭用并改善性能。注意v$sql中BUFFER_GETS/EXECUTIONS大的語句。
2.Hot block
當(dāng)多個會話重復(fù)訪問一個或多個由同一個子cache buffers chains鎖存器保護(hù)的塊時,熱塊就會產(chǎn)生。
當(dāng)多個會話爭用cache buffers chains子鎖存器時,就會出現(xiàn)這個等待事件。有時就算調(diào)優(yōu)了SQL,但多個會話同時執(zhí)行此SQL,
那怕只是掃描特定少數(shù)塊,也是也會出現(xiàn)HOT BLOCK的。???
解決方法:
?
1.優(yōu)化SQL,如優(yōu)化nested loop join,如果有可能使用hash join代替nested loop join。
2.可以利用對熱塊索引進(jìn)行hash分區(qū),或者使用hash簇的方式減緩熱塊現(xiàn)象。
3.調(diào)整表的pctfree值,將數(shù)據(jù)盡可能的分布到多個塊中,但相同的查詢要掃更多塊,有負(fù)面作用。
4.并行查詢是直接讀數(shù)據(jù)文件,不經(jīng)過SGA,即direct path read,所以就不存在鎖存器爭用的情況了。
但其一般是為了大量數(shù)據(jù)讀取而使用的,不作為一般的解決方案。
5.等問題自己消失。有時當(dāng)出現(xiàn)latch爭用時,故障時刻確實沒有較好的方式解決,找到病因才是關(guān)鍵。
總結(jié)
以上是生活随笔為你收集整理的等待事件 latch:cache buffers chains的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: day06_类与对象
- 下一篇: 总有朋友啊