Wait Eventの一覧をただ上から眺めても、FGとBGが混在していると本当のボトルネックは見えてこないもので、カテゴリ分類とHistogramを組み合わせて読む方法を、待機イベントの分類に苦労した経験をもとにまとめました。

FGとBG — Wait Eventの2種類

Wait Eventドリルダウン(STATSPACK)図

図1: STATSPACKからのWait Event原因特定

STATSPACKのWait Eventsセクションは Foreground(FG)Background(BG) に分離されています。 これがAWRと異なる重要な点です。

種類対象プロセス診断の意義
Foreground Wait Eventsユーザーセッションユーザーが体感する遅延の直接原因 → 最優先で分析
Background Wait EventsDBWn/LGWR/ARCnなどOracleバックグラウンドプロセスディスクI/O・REDO書き込みのボトルネック把握
Wait Events (fg and bg)FG+BG合算全体俯瞰には使えるが、個別診断はFG/BG分離で行う

全体フローは PART 01。Wait Eventsセクションの定義は PART 04 — Wait Events Statistics 詳細(定義書) を参照。

Wait Eventのカテゴリ分類

Foreground Wait Eventsに現れるイベントを4カテゴリに分類します。

カテゴリ代表的なイベント次のアクション
User I/Odb file sequential read, db file scattered readPART 06 I/O分析
System I/Olog file parallel write, db file parallel writeBackground Wait Events も確認
Concurrencybuffer busy waits, latch系, enqueue系PART 08 Latch/Lock
Commitlog file syncコミット頻度・LGWR性能を確認

I/O系待機イベント

Wait Event意味対処の方向性
db file sequential readインデックスを使ったシングルブロック読み込みインデックス不適切 / I/O性能不足 → PART 06
db file scattered readフルスキャンのマルチブロック読み込み不要なフルスキャン → PART 05
direct path read temp一時セグメントからの読み込みソート/ハッシュのメモリ不足 → PART 07

競合系待機イベント

Wait Event意味対処の方向性
buffer busy waitsバッファブロックの競合ホットブロック → PART 08
latch: cache buffers chainsバッファキャッシュのLatch競合ホットブロック → PART 08
enq: TX - row lock contention行ロック競合トランザクション設計見直し → PART 08
log file syncCOMMITのREDOログ書き込み待ちコミット頻度削減 / LGWR I/O改善

Wait Event Histogramの活用

Wait Event Histogram(STATSPACKのWait Events内)はイベントの待機時間分布を示します。 AVG値だけでは見えない「少数の極端に長い待機」を検出するのに有効です。

Histogramの見方診断のポイント
1ms以下に集中通常はメモリアクセス。問題なし
8ms〜32msにピークHDD相当のI/O遅延
1秒以上の待機があるロック待ち・ネットワーク問題の可能性

STATSPACKならではのWait診断のポイント

AWRと共通の分析手順に加え、STATSPACKのFG/BG分離とHistogramを活かした診断のポイントを整理する。

ポイント具体的な確認方法AWRとの違い
FG/BGを分けて原因を切り分ける Foreground Wait Eventsでユーザー体感の遅延原因を確認してからBackground Wait Eventsでシステム側の問題を確認する AWRは合算表示が基本。STATSPACKはFG/BG分離が標準のため、バックグラウンドノイズにより診断がブレにくい
Wait Event Histogramで外れ値を検出する 平均待機時間が短くても、1秒超の待機が数件あればロック競合やストレージ瞬断の可能性がある AWRのHTMLレポートも分布を表示するが、STATSPACKのHistogramはテキスト表形式で扱いやすい
log file syncのFG比率を確認する Foreground側にlog file syncが多ければアプリのコミット頻度が高い。Background側に多ければLGWRのI/O性能の問題 AWRは合算のため、どちらの問題かが1画面では判断しにくい
Snap Level 5以上が必要なイベントを把握する Snap Level 5未満ではWait Eventsのセクション自体が取得されないため、比較前にスナップのレベルを確認する AWRはデフォルトで全イベントを取得。STATSPACKはSnap Levelの設定によって取得内容が変わる

ドリルダウン手順

1
Top 5 Timed Events で上位イベントを確認
Wait Event名と % DB Time を記録する
2
Foreground Wait Events でFGの詳細を確認
ユーザーへの影響が大きいFGイベントを優先的に分析
3
カテゴリを判定して専門PARTへ
I/O系 → PART 06 / 競合系 → PART 08 / SQL問題 → PART 05
4
Wait Event Histogramで待機時間分布を確認
ロング待機が少数ある場合は特定イベントの詳細を調査

Wait分析でよくある誤り

Wait Eventの名称だけで原因を決めつけると対策が的外れになる。

誤り何が起きるか正しい読み方
「db file sequential read」が上位なので「索引アクセスが遅い=ストレージ増強」と判断する実際はSQL側の非効率(索引が選択されすぎるFull Index Scan等)が原因のことがあり、ストレージ増強では改善しないI/O分析(PART 06)でAv Rd(ms)を確認し、ストレージ遅延かSQL非効率かを分離する
Idle Wait(SQL*Net message from client等)をWait分析の対象に含めるIdleイベントはアプリの待ち時間であり、DB側の問題ではない。含めると「待機イベントが多い」と誤解するNon-Idle Wait ClassのForeground Wait EventsのみをWait分析の対象にする
Wait Event Histogramを省略する平均待機時間が低くても間欠的なスパイク(>1秒ビン)を見逃し、断続的な障害を早期発見できない主要Wait EventのHistogramで>1sビンの有無を必ず確認する