【TUNE_ORACLE】等待事件之“buffer busy waits”

Attack_on_Jager發表於2021-07-29

定義

當會話想要訪問緩衝區快取中的資料庫塊但由於緩衝區“繁忙”而無法訪問時,會發生這種等待。 可能發生這種情況的兩種主要情況是:

1. 當一個會話將資料塊從磁碟讀到記憶體中,發現記憶體沒有空閒的記憶體塊。

2. 發生一致性讀時,由於需要建立某個時刻的前映象,就需要在記憶體中申請記憶體塊,如果沒有空閒的記憶體塊,就會發生該等待事件。

當資料庫中存在熱塊時,即使用者頻繁讀取或者修改某個資料塊時,會發生該等待事件。

 

對於自身範圍內產生的等待

1. 檢視動態效能檢視V$SESSION_WAIT涉及到的“buffer busy waits”引數

P1 = file#

P2 = block#

P3 = id

注:

file#:包含等待會話所需塊的資料檔案的檔案號。

block#:等待會話想要訪問file#中的塊號。

id:官方釋義如下

 

2. 等待時間

正常等待時間為1秒。如果會話在上次等待期間一直在等待獨佔緩衝區,那麼它將等待3秒。會話將保持超時/等待,直到它申請到緩衝區。

 

3. 尋找“Blockers”

找到阻塞過程可能非常困難,因為所需的資訊沒有外化。如果P3顯示“buffer busy waits”正在等待塊讀取完成,則阻塞會話可能正在等待I/O等待(例如:“db file sequential read”或“db file scattered read”)用於相同的file#和block#。

如果等待是由於緩衝區處於不相容模式,那它應該很快被釋放。

 

對於系統範圍內產生的等待

如果等待緩衝區所非常耗時,那麼最好確定哪個段正在發生爭用。Bstat/estat或STATSPACK報告的“緩衝區繁忙等待統計”部分顯示了哪些塊型別看到最多的爭用。使用以下SQL查詢等待時間最多的塊:

 SELECT time, count, class
    FROM V$WAITSTAT
   ORDER BY time,count;

使用以下SQL檢視發生等待時塊的儲存位置:

 SELECT kcbwhdes, why0+why1+why2 "Gets", "OTHER_WAIT"
    FROM x$kcbsw s, x$kcbwh w
   WHERE s.indx=w.indx
     and s."OTHER_WAIT">0
   ORDER BY 3;

 

用下面的SQL可以檢視等待最多的檔案,因此通過組合上述資訊,我們知道哪個檔案中的什麼塊型別導致等待:

SELECT count, file#, name
    FROM x$kcbfwait, v$datafile
   WHERE indx + 1 = file#
   ORDER BY count;

 

可以使用如下查詢檢視每個檔案中的段:

SELECT distinct owner, segment_name, segment_type
    FROM dba_extents
   WHERE file_id= &FILE_ID;

 

如果列出的型別有大量段,可重複執行以下語句並收集輸出,並每經過一段時間對結果進行排序以檢視哪些檔案和塊顯示爭用:

SELECT p1 "File", p2 "Block", p3 "Reason"
    FROM v$session_wait
   WHERE event='buffer busy waits';

 

減少等待和等待時間的方法

由於該等待事件是由於對特定塊的爭用,所以消除塊的爭用的原因是最好的方式。 請注意,資料塊的“buffer busy waits”通常是由於多個程式重複讀取相同的塊(例如:如果很多人掃描相同的索引),第一個會話快速處理緩衝區快取中的塊,然後塊必須從磁碟讀取。其他會話(掃描相同的索引)快速“趕上”並想要當前正在從磁碟讀取的塊,他們會等待緩衝區騰出空間,因為有人已經在讀取該塊。

對特定型別的爭用可以參考以下方法來減少爭用:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2784109/,如需轉載,請註明出處,否則將追究法律責任。

相關文章