SQL Statistics の全体像

AWRの SQL Statistics セクションには、複数の観点でSQLをランキングしたテーブルがあります。 それぞれ異なる問題を炙り出すため、目的に合わせて使い分けます。

テーブル名ランキング基準適した問題
SQL ordered by Elapsed Time合計経過時間全体的に最も重いSQL(最重要)
SQL ordered by CPU Time合計CPU消費時間CPU高負荷の原因SQL
SQL ordered by Gets論理読み込みブロック数バッファキャッシュを大量消費するSQL
SQL ordered by Reads物理読み込みブロック数I/Oを引き起こすSQL
SQL ordered by Executions実行回数頻繁に呼ばれる軽いSQL(積み重ね)
SQL ordered by Parse Callsパース回数バインド変数未使用SQL

SQLの基礎は PART 05 — SQL Statistics 重いSQLの特定(AWR入門) を、項目定義は PART 05 — SQL Statistics 詳細(定義書) を参照。

Elapsed Time で重いSQLを特定する

まず SQL ordered by Elapsed Time を見ます。 Elapsed Time(s)(合計実行時間)が上位のSQLが全体の負荷に最も寄与しています。

列名意味注目ポイント
Elapsed Time (s)合計経過時間(秒)最も総合的な重さを示す
Executions実行回数高回数 × 軽い1回 or 低回数 × 重い1回を区別
Elapsed Time / Execute1回あたりの経過時間1回が重いSQLを特定できる
% Total DB TimeDB Timeに占める割合30%超のSQLは最優先でチューニング

CPU / Gets / Reads から原因を分析する

Elapsed Timeが高いSQLが特定できたら、その原因を CPU Time / Gets / Reads の比率で診断します。

状況原因の仮説次のアクション
CPU Time ≒ Elapsed TimeCPU使用が多い(ソート・ハッシュ結合・フルスキャン)実行計画を確認、インデックス追加を検討
Reads が多い(Getsも多い)物理I/O + バッファキャッシュミスPART 06 I/O分析
Gets が多い(Readsは少ない)論理読み込みが多い(効率の悪いインデックスorフルスキャン)実行計画の見直し
Elapsed ≫ CPU(待機が多い)I/O待ち or 競合待ちPART 04 Wait分析

SQL_ID から実行計画へのドリルダウン

AWRレポート(HTML形式)では SQL_ID がリンクになっており、クリックするとSQL全文と実行計画(ある場合)に飛べます。 また、以下のSQLでV$SQL_PLANから実行計画を取得することも可能です。

⚠️ 実行計画の確認

AWRのSQL Statisticsはスナップショット期間中の累積値です。問題発生時点の実行計画は DBA_HIST_SQL_PLANAWR SQL Report で確認してください。実行計画の読み方は 実行計画セクション定義書 を参照。

優先順位付けの考え方

SQLチューニングの優先順位

% Total DB Time が高いSQL(全体負荷への寄与が大きい)
Elapsed / Execute が異常に高いSQL(1回が重い)
Parse Calls ≒ Executions のSQL(毎回ハードパース)
④ 実行回数が多く積み重なっているSQL