眾多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';