溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL中出現(xiàn)latch:cache buffers chains報錯怎么解決

發(fā)布時間:2022-01-11 17:14:37 來源:億速云 閱讀:216 作者:iii 欄目:關系型數(shù)據(jù)庫

這篇文章主要介紹了SQL中出現(xiàn)latch:cache buffers chains報錯怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇SQL中出現(xiàn)latch:cache buffers chains報錯怎么解決文章都會有所收獲,下面我們一起來看看吧。

1.產(chǎn)生原理

當一個數(shù)據(jù)塊讀入到sga中時,該塊的塊頭(buffer header)會放置在一個hash bucket的鏈表(hash chain)中。該內存結構由一系列cache buffers chains子latch保護(又名hash latch或者cbc latch)。對Buffer cache中的塊,要select或者update、insert,delete等,都得先獲得cache buffers chains子latch,以保證對chain的排他訪問。若在過程中發(fā)生爭用,就會等待latch:cache buffers chains事件。

2.產(chǎn)生原因:

(1). 低效率的SQL語句(主要體現(xiàn)在邏輯讀過高) 在某些環(huán)境中,應用程序打開執(zhí)行相同的低效率SQL語句的多個并發(fā)會話,這些SQL語句都設法得到相同的數(shù)據(jù)集,每次執(zhí)行都帶有高 BUFFER_GETS(邏輯讀取)的SQL語句是主要的原因。相反,較小的邏輯讀意味著較少的latch get操作,從而減少鎖存器爭用并改善性能。注意v$sql中BUFFER_GETS/EXECUTIONS大的語句。

(2).Hot block 當多個會話重復訪問一個或多個由同一個子cache buffers chains鎖存器保護的塊時,熱塊就會產(chǎn)生。當多個會話爭用cache buffers chains子鎖存器時,就會出現(xiàn)這個等待事件。有時就算調優(yōu)了SQL,但多個會話同時執(zhí)行此SQL,那怕只是掃描特定少數(shù)塊,也是也會出現(xiàn)HOT BLOCK的。

3.解決方法

(1).優(yōu)化SQL,如優(yōu)化nested loop join,如果有可能使用hash join代替nested loop join。

(2).可以利用對熱塊索引進行hash分區(qū),或者使用hash簇的方式減緩熱塊現(xiàn)象。

(3).調整表的pctfree值,將數(shù)據(jù)盡可能的分布到多個塊中,但相同的查詢要掃更多塊,有負面作用。

(4).并行查詢是直接讀數(shù)據(jù)文件,不經(jīng)過SGA,即direct path read,所以就不存在鎖存器爭用的情況了。但其一般是為了大量數(shù)據(jù)讀取而使用的,不作為一般的解決方案。

(5).等問題自己消失。有時當出現(xiàn)latch爭用時,故障時刻確實沒有較好的方式解決,找到病因才是關鍵。

4.查找熱點快對象

是從當前等待latch:cache buffers chains事件的會話出發(fā)。通過v$session_wait視圖,獲得P1RAW即子鎖存器的地址。通過重復觀察v$session_wait視圖,發(fā)現(xiàn)某個子鎖存器地址較多地出現(xiàn),那么該子鎖存器管轄的chain可能有熱塊。

select p1,p1raw from v$session_wait where event='latch: cache buffers chains';

所以v$session的p1raw與x$bh的laddr,以及v$latch_children的addr是同樣的東西,都是子鎖存器的地址。大概思路是,通過子鎖存器的熱度來找到所管轄的對象,以及對象的熱度。

通過子鎖存器地址,即v$latch_children的addr字段,來獲取這些子鎖存器所管理的對象的文件號塊號與熱度。 注意到x$bh字典表中的tch字段表示的就是block的touch count,一般來說這個值越高那么這個塊就越熱,我們稱這樣的塊就叫做熱點塊。

  1. SELECT hladdr,

  2.          obj,

  3.          (SELECT object_name

  4.             FROM dba_objects

  5.            WHERE (data_object_id IS NULL AND object_id = x.obj)

  6.                  OR data_object_id = x.obj AND ROWNUM = 1)

  7.             AS object_name,

  8.          dbarfil,

  9.          dbablk,

  10.          tch

  11.     FROM x$bh x

  12.    WHERE hladdr IN ('00000000DA253C08', '00000000DA380310')

  13. ORDER BY tch DESC;


根據(jù)FILE#,dbablk來找出對應對象。 

  1. select * from dba_extents where file_id=10 and 36643122 between block_id and block_id + blocks - 1;

  1. select * from dba_extents where file_id=10 and 36643122 between block_id and block_id + blocks - 1;

關于“SQL中出現(xiàn)latch:cache buffers chains報錯怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“SQL中出現(xiàn)latch:cache buffers chains報錯怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

sql
AI