AWR(Automatic Workload Repository)は Oracle が自動的にパフォーマンス統計を収集・保存する機能です。デフォルトで 1時間ごとにスナップショットを取得し、最大 8日分のデータを保持します。
AWR レポートは「特定の期間に何がボトルネックだったか」を示すパフォーマンス分析レポートです。「昨日の午後 2時から4時の間にシステムが重かった」という状況を事後に分析するのに最適で、DBA の日常業務から重大障害の事後調査まで幅広く使われます。
- AWR スナップショットの管理(手動作成・保持期間の変更)
- awrrpt.sql で AWR レポートを生成する手順
- AWR レポートの重要セクション(Load Profile・Top 5 Timed Events・SQL Statistics)の読み方
- 遅い SQL を AWR から特定して実行計画を確認する方法
- DBA_HIST_* ビューで AWR データを直接クエリする方法
- AWR と ASH(Active Session History)の使い分け
AWR は Diagnostics Pack(Enterprise Edition のオプション)のライセンスが必要です。Standard Edition や Diagnostics Pack ライセンスなしの環境では STATISTICS_LEVEL=TYPICAL であってもAWR レポートの生成・DBA_HIST_* ビューの参照は技術的には可能ですがライセンス違反になります。利用前にライセンスを確認してください。
AWR スナップショットの管理
-- 最近のスナップショット一覧を確認する
SELECT snap_id, begin_interval_time, end_interval_time, snap_level
FROM DBA_HIST_SNAPSHOT
ORDER BY snap_id DESC
FETCH FIRST 24 ROWS ONLY; -- 直近24件(デフォルト1時間間隔なら約1日分)
-- AWR の設定を確認する(スナップショット間隔と保持期間)
SELECT snap_interval, retention FROM DBA_HIST_WR_CONTROL;
-- snap_interval: スナップショットの取得間隔(デフォルト: +00000 01:00:00 = 1時間)
-- retention: 保持期間(デフォルト: +00008 00:00:00 = 8日間)
-- スナップショットの取得間隔と保持期間を変更する
-- 引数: dbid、スナップショット間隔(分)、保持期間(分)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
retention => 43200, -- 30日間(43200分)に延長
interval => 60 -- 60分ごと(デフォルト)
);
-- 特定の期間のパフォーマンス問題を詳しく調査したい場合は手動スナップショットを取る
-- 問題発生前後に手動でスナップショットを取ると、より細かい時間で比較できる
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
-- 作成されたスナップショットの snap_id を確認する
SELECT MAX(snap_id) AS latest_snap_id FROM DBA_HIST_SNAPSHOT;
-- 特定のスナップショットを削除する
EXEC DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id => 100, high_snap_id => 200);
AWR レポートの生成手順
# SQL*Plus で DBA 権限のユーザーで接続する
sqlplus / as sysdba
# AWR レポート生成スクリプトを実行する
SQL> @?/rdbms/admin/awrrpt.sql
# @? は $ORACLE_HOME を指す
# スクリプトが対話的に質問してくる:
# Enter value for report_type: html # html または text を指定(html 推奨)
#
# Listing the last 3 days of Completed Snapshots
# Instance DB Name Snap Id Snap Started Level
# -------- -------- ------- ------------ -----
# orcl ORCL 1234 01 Apr 2026 1
# 1235 01 Apr 2026 1
# ...
#
# Enter value for num_days: 1 # 何日分のスナップショット一覧を表示するか
# Enter value for begin_snap: 1234 # 開始スナップショット ID
# Enter value for end_snap: 1235 # 終了スナップショット ID
# Enter value for report_name: awr_report_1234_1235.html # 出力ファイル名
# RAC 環境でインスタンスを指定する場合は awrrpti.sql を使う
SQL> @?/rdbms/admin/awrrpti.sql
# RAC 全インスタンスをまとめたグローバルレポートは awrgrpt.sql を使う
SQL> @?/rdbms/admin/awrgrpt.sql
# DBMS_WORKLOAD_REPOSITORY を使ってプログラムで生成する
SELECT output FROM TABLE(
DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(
l_dbid => (SELECT dbid FROM V$DATABASE),
l_inst_num => 1,
l_bid => 1234, -- begin_snap
l_eid => 1235 -- end_snap
)
);
AWR レポートの重要セクションの読み方
Report Summary セクション
| 項目 | 意味 | 注目ポイント |
|---|---|---|
| Elapsed Time | レポート期間(分) | スナップショット間隔が正しいか確認する |
| DB Time | すべてのフォアグラウンドセッションが消費した合計時間(秒) | Elapsed Time に比べて大幅に大きければ DB が高負荷だった |
| DB CPU | CPU 消費時間(秒) | DB Time の多くが CPU なら CPU バウンド、そうでなければ I/O・待機バウンド |
Top 5 Timed Events セクション
AWR レポートで最も重要なセクションの一つです。DB Time を最も消費した待機イベント上位5件が表示されます。ここに表示されたイベントがパフォーマンス問題の主要因です。
| よくある待機イベント | 意味と対処の方向性 |
|---|---|
| CPU time | CPU 消費が主。実行計画の最適化・インデックスの追加を検討する |
| db file sequential read | インデックスのシングルブロック読み取り I/O。インデックス最適化・バッファキャッシュのサイズ確認 |
| db file scattered read | フルテーブルスキャンのマルチブロック読み取り。インデックスの追加・パーティション化を検討する |
| log file sync | COMMIT 時の REDO ログ書き込み待ち。COMMIT の頻度を減らす・ストレージ I/O の改善 |
| enq: TX – row lock contention | 行ロック競合。アプリのトランザクション設計を見直す |
| gc buffer busy acquire | RAC 環境でのグローバルキャッシュ競合 |
SQL Statistics セクション(遅い SQL の特定)
SQL Statistics セクションには、CPU 時間・経過時間・実行回数・論理読み取り数などの基準でランキングされた SQL が表示されます。
-- 特定のスナップショット範囲で CPU 時間が多い SQL を確認する
SELECT
s.sql_id,
s.executions_delta AS execs,
ROUND(s.cpu_time_delta / 1e6, 1) AS cpu_sec,
ROUND(s.elapsed_time_delta / 1e6, 1) AS elapsed_sec,
ROUND(s.cpu_time_delta / NULLIF(s.executions_delta, 0) / 1e6, 3) AS cpu_per_exec_sec,
ROUND(s.buffer_gets_delta / NULLIF(s.executions_delta, 0)) AS lreads_per_exec,
s.sql_text
FROM DBA_HIST_SQLSTAT s
WHERE s.snap_id BETWEEN 1234 AND 1235 -- スナップショット範囲
AND s.executions_delta > 0
AND s.cpu_time_delta > 0
ORDER BY s.cpu_time_delta DESC
FETCH FIRST 10 ROWS ONLY;
-- SQL の実行計画を AWR から取得する
SELECT plan_table_output
FROM TABLE(
DBMS_XPLAN.DISPLAY_AWR(
sql_id => 'xxxxxxxxxxxx', -- sql_id を指定
format => 'ALLSTATS'
)
);
-- SQL_ID から SQL テキスト全文を確認する
SELECT sql_text FROM DBA_HIST_SQLTEXT WHERE sql_id = 'xxxxxxxxxxxx';
-- 特定期間に I/O が多かった SQL を確認する
SELECT
sql_id,
SUM(disk_reads_delta) AS total_disk_reads,
SUM(executions_delta) AS total_execs,
ROUND(SUM(disk_reads_delta) / NULLIF(SUM(executions_delta), 0)) AS disk_reads_per_exec
FROM DBA_HIST_SQLSTAT
WHERE snap_id BETWEEN 1234 AND 1235
GROUP BY sql_id
HAVING SUM(disk_reads_delta) > 10000
ORDER BY total_disk_reads DESC
FETCH FIRST 20 ROWS ONLY;
AWR と ASH の使い分け
| 機能 | AWR | ASH(Active Session History) |
|---|---|---|
| 収集粒度 | スナップショット間隔(デフォルト1時間)の累積統計 | 1秒ごとのアクティブセッションのサンプリング |
| 向いている用途 | 長期トレンド分析・特定時間帯の全体的なボトルネック特定 | 短時間の急激な性能低下・特定のセッション・SQL の分析 |
| 分析期間 | 数時間〜数日 | 数分〜数時間 |
| 主要ビュー | DBA_HIST_SQLSTAT・DBA_HIST_SYSTEM_EVENT | V$ACTIVE_SESSION_HISTORY(メモリ)・DBA_HIST_ACTIVE_SESS_HISTORY(永続化分) |
| レポート | awrrpt.sql(HTML / テキスト) | ashrpt.sql / ashviewer.sql |
まとめ
- AWR の基本:デフォルト1時間ごとにスナップショットを取得し8日分保持する。DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS で保持期間と間隔を変更できる。問題発生時は手動スナップショットを取ると細かい分析ができる
- AWR レポート生成:@?/rdbms/admin/awrrpt.sql を実行して開始・終了スナップショット ID を指定する。HTML 形式が読みやすい。DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML でプログラム生成も可能
- Top 5 Timed Events が最重要:DB Time を最も消費した待機イベント上位5件。CPU time が多ければ SQL の最適化、db file scattered read が多ければフルスキャン対策を検討する
- SQL Statistics:CPU 時間・経過時間・I/O 回数の上位 SQL が列挙される。DBA_HIST_SQLSTAT をクエリして任意の条件で絞り込める。DBMS_XPLAN.DISPLAY_AWR で実行計画も確認できる
- AWR vs ASH:数時間以上の傾向分析には AWR、数分〜数時間の急激な問題には ASH を使う。問題の規模と時間軸に合わせて使い分ける
AWR と合わせて使う ASH(Active Session History)については Oracle AWR・ASH 完全ガイドを参照してください。SQL の実行計画を DBMS_XPLAN で詳細分析する方法は Oracle DBMS_XPLAN 完全ガイドも参照してください。