Oracleデータベースでパフォーマンス問題が発生したとき、最初に取り組むべきは「どのSQLが遅いのか」を特定することです。遅いSQLを見つけ出せれば、インデックスの最適化やSQLチューニングによってボトルネックを解消できます。
この記事では、V$SQLやAWRレポートなどを使って、遅いSQLを特定する実践的な方法を紹介します。
1. V$SQLビューでリソース消費の多いSQLを確認
V$SQLは、過去に実行されたSQL文の統計情報を保持している動的パフォーマンスビューです。CPU使用量、実行回数、ディスク読み取りなどの情報をもとに、負荷の高いSQLを特定できます。
例:CPU時間が多いSQLを上位から確認
SELECT * FROM (
SELECT sql_id,
executions,
elapsed_time / 1000000 AS elapsed_sec,
cpu_time / 1000000 AS cpu_sec,
disk_reads,
buffer_gets,
sql_text
FROM v$sql
WHERE executions > 0
ORDER BY cpu_time DESC
)
WHERE ROWNUM <= 10;
このクエリでは、CPU消費時間の多いSQL文を10件抽出しています。
「elapsed_time」や「buffer_gets」でソートすることで、別の観点から遅いSQLを洗い出すことも可能です。
2. AWRレポートで長期的な傾向を把握
Oracle Enterprise Editionを利用している場合、AWR(Automatic Workload Repository)レポートを使うことで、一定期間の間に最も負荷のかかったSQLを確認できます。
AWRレポートの出力方法(SQL*Plus)
sqlplus / as sysdba
@?/rdbms/admin/awrrpt.sql
実行すると、対象のインスタンス・スナップショット間・出力形式(HTMLまたはTEXT)を選択できます。
出力されたレポートでは、次のセクションに注目します:
- Top SQL by Elapsed Time
- Top SQL by CPU Time
- Top SQL by Buffer Gets
各SQLに対応するSQL ID
やElapsed Time
、Executions
などが表示されるため、問題のあるSQLを素早く把握できます。
3. V$ACTIVE_SESSION_HISTORY(ASH)の活用
ASHビューは、アクティブなセッションの情報をサンプリングして記録しており、リアルタイム性の高い分析が可能です。特に一時的なスパイクや特定の時間帯の遅延を分析するのに有効です。
例:過去15分間で最もアクティブだったSQL
SELECT sql_id, COUNT(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE - (15 / 1440)
GROUP BY sql_id
ORDER BY samples DESC;
4. SQLの内容を確認するには
SQL IDが特定できたら、次のようにSQL本文を取得できます。
SELECT sql_text
FROM v$sql
WHERE sql_id = 'xxxxxxxxxxxxxxx';
その後、EXPLAIN PLAN
やDBMS_XPLAN
を使って実行計画を確認し、テーブルスキャンや結合方法などの問題点を調査します。
5. 遅いSQLが見つかった後の対処
ボトルネックとなっているSQLが判明したら、以下のような対応を検討します。
- インデックスの追加やヒント句の使用
- 不要な結合やサブクエリの削除
- バインド変数の利用でSQLの共有化
- 統計情報の更新(
DBMS_STATS
)
チューニング後は、AWRやV$SQLを再確認して効果を検証するのも重要です。
まとめ
Oracleデータベースでのパフォーマンス改善には、「どのSQLが遅いのか」を正確に把握することが第一歩です。以下の手段を状況に応じて使い分けましょう。
- V$SQL:直近のSQLの実行統計を確認
- AWRレポート:期間内で負荷の高かったSQLを確認
- V$ACTIVE_SESSION_HISTORY:リアルタイムな遅延原因を特定
SQL IDから実行計画や統計情報をもとに、継続的なパフォーマンス改善を行いましょう。