眾多Oracle有關問題中,其中最重要的一個是緩衝區忙等待(buffer busy wait)事件。
緩衝區忙等待是I/O-bound Oracle系統中最常見的現象,尤其是在Oracle STATSPACK報告的前五個忙等待的讀(順序/分散)系統中,如前5個定時事件:% 總和事件等待 時間(s)消逝時間
--------------------------- ------------ ----------- -----------
db檔案順序讀 2,5987,146 48.54
db檔案分散讀25,5193,246 22.04
庫緩衝區載入死結6731,3639.26
CPU時間 2,154 9347.83
記錄檔平行寫 19,157 8375.68
減輕緩衝區忙等待的主要方式是減少系統中的I/O,這可以通過SQL使用更少的塊讀(block reads,比如添加索引)的方式得以實現。即使對於一個比較大的db_cache_size,我們也可以減少緩衝區忙等待的時間。
為了能夠查看整個系統的等待事件,我們可以查閱v$system_event效能檢視。這一效能檢視提供了等待事件的名稱,等待事件與時間的總和,以及每一事件的平均等待時間。
可以通過v$waitstat視圖來查詢導致等待的緩衝區的類型。這一視圖列出了每一緩衝區類型的等待,COUNT是類所有的等待總和,TIME是這一類所有等待的時間總和,如下所示: select * from v$waitstat;
類 COUNT TIME
------------------ ---------- ----------
data block19611131870278
segment header 34535 159082
undo header233632 86239
undo block 1886 1706
當一個session訪問緩衝區的塊時,就有可能產生緩衝忙等待。這一緩衝區忙等待的產生可能由以下的原因造成的:
塊可能被其它的session讀到緩衝區,所以session必須等待塊的讀入結束。
session可能有與等待的session查詢不協調的緩衝塊。
由於緩衝區忙等待是由不同特定的塊之間的競爭而造成的,所以只能通過識別哪些塊發生衝突和衝突產生的原因,你才有可能做出判斷,相應的調整包括識別和消除塊競爭的原因。
v$session_wait效能檢視,提供了識別等待產生原因的方法。
v$session_wait視圖的列代表的緩衝區忙等待事件如下:
P1—與等待相關的資料檔案的全部檔案數量。
P2—P1中的資料檔案的塊數量。
P3—描述等待產生原因的代碼。
這裡是一個這些值的Oracle資料詞典查詢: select
p1 "File #".
p2 "Block #",
p3 "Reason Code"
from
v$session_wait
where
event = 'buffer busy waits';