緩衝區忙等待是 I/O-bound 系統最常見現象,常佔 STATSPACK 前五大等待事件。例如:
事件 等待次數 時間(秒) 佔比
db file sequential read 2,598,714 48.54
db file scattered read 25,519,324 22.04
library cache load deadlock 6,731,363 9.26
CPU time 2,154 9347.83
log file parallel write 19,157 8375.68
減少系統 I/O:優化 SQL 使用較少區塊讀取(如加索引),即使較大 DB_CACHE_SIZE 也能降低等待時間。
V$SYSTEM_EVENT:系統級等待事件統計V$WAITSTAT:各緩衝區類型等待計數與時間
CLASS COUNT TIME
data block 1961113 1870278
segment header 34535 159082
undo header 233632 86239
undo block 1886 1706
V$SESSION_WAIT:識別具體等待塊
SELECT OWNER, SEGMENT_NAME, SEGMENT_TYPE
FROM DBA_EXTENTS
WHERE FILE_ID = &P1
AND &P2 BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS - 1;
再配合 V$SEGMENT_STATISTICS 即時監控塊級統計,識別熱門表/索引。
| 代碼 | 含義 |
|---|---|
| 0 | 塊正被讀入緩衝區 |
| 100 | 欲建立 NEW 塊,但該塊正被其他 Session 讀入 |
| 110 | 欲設為共享,但塊被他人讀入,需等待 read() 結束 |
| 120 | 欲取得 CURRENT 塊,但他人已讀入,等待其讀入結束 |
| 130 | 塊被他人讀入且無其他協調塊,需等待讀入結束(緩衝區死鎖後也可能) |
| 200 | 欲建立新塊,但他人正在使用 |
| 210 | Session 欲讀入 SCUR/XCUR 塊,若塊交換或非連續 TX 模式,等待可能極長 |
| 220 | 查詢塊當前版本,但有人以非法模式使用 |
| 230/231 | 以 CR/CRX 取得塊,但塊中變更已開始未結束 |
PCTFREE/PCTUSED 識別並消除熱塊,減少資料塊數量。FREELISTS 值;Parallel Server 確保每實例有獨立 FREELIST GROUPS。FREELISTS,使用 FREELIST GROUPS。緩衝區忙等待識別與解決複雜棘手,V$SEGMENT_STATISTICS 有助監控。正確識別並修正原因,投入努力定能獲回報。