※本記事は、Ulrike Schwinn による”Real-Time SQL Monitoring: a MUST for SQL Tuning” を翻訳したものです。
2026年5月26日
SQL Monitoring(Real-Time Monitoring とも呼ばれます)は、データベースの監視とチューニングの分野で最も重要なツールの 1 つになっています。特定の、主に長時間実行される操作について、最新の概要をすばやく簡単に把握できます。AWR や STATSPACK レポートとは異なり、SQL Monitor では、現在アクティブな文やキュー内にある文も表示されます。必ずしも「長時間実行」ではない文でも、特定の条件を満たす場合は自動的に一覧表示されます。特に、新しいアプリケーション、新しい技術や機能を扱う場合、SQL Monitoring はテスト・プロセスにおける重要なステップです。
最近、Real-Time SQL Monitoring について改めて説明し、例を示してほしいという依頼を受けました。そこで、この機会に FAQ 形式で重要なポイントをまとめ、一般的に利用できるようにいくつかの SQL スクリプトを GitHub にアップロードしました。
注:ここに追加したほうがよい質問がありましたら、ぜひお知らせください。
質問:
- Real-Time SQL Monitoring とは何ですか?
- V$SESSION_LONGOPS と SQL Monitoring の違いは何ですか?
- SQL Monitoring を使用するための要件と前提条件は何ですか?
- 特定の文を監視対象にするためにヒントを使用できません。他に何ができますか?
- コマンドラインで SQL Monitoring を使用するにはどうすればよいですか?
- SQL Monitor ACTIVE HTML レポートとは何ですか?
- Oracle SQL Developer のどこで SQL Monitoring を確認できますか?
- Autonomous AI Database のどこで SQL Monitoring を確認できますか?
- V$SQL_MONITOR で参照できなくなった過去の文を監視できますか?
- 開発者は SQL Monitoring をどのように利用できますか?特別な権限は必要ですか?
- 複数の文を含む統合 SQL Monitoring レポートを生成するにはどうすればよいですか?
- Real-Time SQL Monitoring で「Runaway」クエリを監視できますか?
- 26ai の新機能は何ですか?
- ドキュメントなどの詳細情報はどこで確認できますか?
Real-Time SQL Monitoring とは何ですか?
Real-Time SQL Monitoring は、コストが高いとみなされる SQL 文、PL/SQL ブロック、さらには複合データベース操作を自動的に監視します。ここで、単純なデータベース操作とは、単一の SQL 文または PL/SQL プロシージャ/ファンクションを指します。複合データベース操作とは、データベース・セッション内の 2 つの定義された時点の間で実行されるアクティビティです(後述の質問を参照)。Real-Time SQL Monitoring には、従来の「explain plan」手法に比べていくつかの利点があります。最大の利点は、SQL 文の実行中にどこで時間が費やされたかを可視化できることです。また、この機能は、さまざまな種類の操作に対する監視情報を含む詳細なレポート、つまり SQL Monitoring レポートも提供します。
通常どおり、Oracle Database 自体が独自のフレームワークを提供しており、外部ツールや追加インストールを使用せずに正確な監視を行えます。このフレームワークには、特別なデータ・ディクショナリ・ビュー、V$ ビュー、各種アドバイザリ・タスク用の PL/SQL パッケージ、専用のワークロード・リポジトリが含まれています。Real-Time SQL Monitoring は Oracle Database 11g で導入され、それ以降、各データベース・リリースで機能強化されてきました。
このテクノロジーを構成する主なパッケージとビューは次のとおりです。
- V$SQL_MONITOR
- DBMS_SQL_MONITOR
- DBMS_SQLTUNE
使いやすく直感的に利用できるよう、この機能は Enterprise Manager Cloud Control、SQL Developer、Cloud Console Performance Hub など、Oracle Database のグラフィカルな監視ツールすべてに実装されています。

画像 1:Cloud Control の Real-Time SQL Monitoring
V$SESSION_LONGOPS と SQL Monitoring の違いは何ですか?
すべてのデータベース・リリースで利用可能な V$SESSION_LONGOPS は、バックアップとリカバリ、統計収集、問合せ実行など、さまざまな操作のステータスを表示します。一般的には 6 秒を超える操作が対象です。監視される操作は Oracle が決定するため、どの操作を監視対象にするかをユーザーが制御することはできません。次の例では、長時間実行中の文を一覧表示し、進捗状況と残り時間を示しています(スクリプトのダウンロード)。
SELECT opname, username, sql_fulltext, to_char(start_time,'DD-MON-YYYY HH24:MI:SS'),
(sofar/totalwork)*100 "%_complete", time_remaining, s. con_id
FROM v$session_longops s INNER JOIN v$sql sl USING (sql_id)
WHERE time_remaining > 0;
SQL Monitoring を使用するための要件と前提条件は何ですか?
必ずしも「長時間実行」ではない文でも、次の条件を満たす場合は自動的に一覧表示されます。単一の文実行については、次の条件の少なくとも 1 つを満たす必要があります。
• パラレル実行
• I/O または CPU 時間で少なくとも 5 秒のリソース消費
• 特別な文ヒント MONITOR の使用(例:select /*+ MONITOR */ … from …)
さらに、Diagnostics Pack と Tuning Pack が必要であり、有効化されている必要があります(つまり、CONTROL_MANAGEMENT_PACK_ACCESS = DIAGNOSTIC+TUNING、STATISTICS_LEVEL = TYPICAL)。
特定の文を監視対象にするためにヒントを使用できません。他に何ができますか?
監視対象にしたい SQL_ID を含めて、次のイベントを設定できます。
ALTER SYSTEM SET EVENTS 'sql_monitor [sql:my sql_id] force=true';
コマンドラインで SQL Monitoring を使用するにはどうすればよいですか?
必要な手順は次の 2 つです。
1) v$SQL と V$SQL_MONITOR を使用して SQL_ID を確認します(スクリプトのダウンロード)。
SELECT distinct s.sql_text, m.sql_id, m.cpu_time
FROM v$sql_monitor m INNER JOIN v$sql s ON s.sql_id=m.sql_id
ORDER BY m.cpu_time;
SQL_TEXT
--------------------------------------------------------------------------
SQL_ID CPU_TIME
------------- ----------
select count(quantity), product_name from soe.order_items o, soe.products p
where p.product_id=o.Product_id group by product_name
7xc7jn2v40p35 27116361
注:別の方法として、SQL*Plus コマンド SET FEEDBACK ON SQL_ID を使用し、SQL*Plus で SQL_ID の自動表示を利用することもできます。
2) DBMS_SQL_MONITOR.REPORT_SQL_MONITOR を使用してレポートを生成します。TYPE 引数に応じて、HTML、TEXT、XML、ACTIVE などのさまざまな形式で生成できます。
詳細な説明については、DBMS_SQL_MONITOR のドキュメントを参照してください。
次の SQL*Plus 書式設定により、正しい HTML SQL Monitoring レポートを生成できます。そうしない場合、生成された出力から冗長な文テキストを削除するなどのクリーンアップが必要になることがあります。
LONG および LONGCHUNKSIZE の書式設定が十分に大きいことを確認してください。
(スクリプトのダウンロード)
set trimspool on
set trim on
set pagesize 0
set linesize 32767
set long 5000000
set longchunksize 5000000
spool sqlmon_active.html
SELECT dbms_sql_monitor.report_sql_monitor(sql_id => '7xc7jn2v40p35', type => 'HTML', report_level => 'ALL')
FROM dual;
spool off
次のスクリーンショットは、生成されたレポートを示しています。

画像 2:(静的)HTML 形式の SQL Monitoring レポート
SQL Monitor ACTIVE レポートとは何ですか?
レポート・タイプとして ACTIVE を選択すると、インタラクティブな SQL Monitoring レポートを取得できます。さらに、棒グラフやレポート内の他の部分にマウスオーバーすると、それぞれの使用量が何に対応しているかが強調表示されます。実行計画、メトリック、プラン・ヒストグラムなど、一部の情報はこのタイプを選択した場合にのみ表示されます。Oracle Database 19c では、SQL Monitor アクティブ・レポートの形式が Java JET テクノロジーに変更され、Flash は使用されなくなりました。
次の例は、アクティブ・レポートを示しています。このレポートはクリック可能なページを備えたアクティブなレポートであり、同僚や専門家に送付して、さらに調査してもらうことができます。
ACTIVE レポートを生成するスクリプトは こちら で確認できます。

画像 3:アクティブ HTML 形式の SQL Monitoring レポート
Oracle SQL Developer のどこで SQL Monitoring を確認できますか?
SQL Developer では、メニュー項目「Tools => Real Time SQL Monitor」を使用すると、監視対象の文の一覧を取得できます。次に、分析したい文をクリックします。プラン統計、プラン、メトリックなどを含む詳細ページが表示されます。Plan Statistics を使用すると、I/O Requests や一時領域の使用量など、Oracle Database のリソース使用状況に関する情報も確認できます。
左側(画像 4 を参照)では、レポートを HTML や ACTIVE レポートとして保存することもできます。

画像 4:SQL Developer の Real-Time SQL Monitor
Autonomous AI Database のどこで SQL Monitoring を確認できますか?
Autonomous AI Database では、Performance Hub から利用できます。Performance Hub を表示するには、Autonomous AI Database の詳細ページで Performance Hub をクリックします。

次に、調査したい SQL ID をクリックします。注意点として、SQL 文は少なくとも 5 秒間実行されている場合、パラレルで実行されている場合、または MONITOR ヒントを使用した場合にのみ監視されます(「SQL Monitoring を使用するための要件と前提条件は何ですか?」のセクションも参照してください)。
表には、CPU Time や Database Time などのディメンション別に、監視対象の SQL 文実行が表示されます。この表には、現在実行中の SQL 文、および完了、失敗、終了した SQL 文が表示されます。表の列には、Status、Duration、SQL ID など、監視対象の SQL 文に関する情報が表示されます。
V$SQL_MONITOR で参照できなくなった過去の文を監視できますか?
はい。取得済みの AWR スナップショットに基づく履歴 SQL Monitoring レポートは、パフォーマンス・ハブ・レポート(Enterprise Manager Cloud Control や Cloud Console など)を使用して生成できます。また、コマンドラインから生成することもできます。
次の手順は、コマンドラインでの使用方法を示しています。
1. DBA_HIST_REPORTS ビューを使用して REPORT_ID を取得します。
SELECT report_id, snap_id FROM dba_hist_reports
WHERE dbid = 2234328383 AND component_name = 'sqlmonitor' AND key1 = '7xc7jn2v40p35'AND
period_start_time > to_date('15/11/2022 13:00:00','DD/MM/YYYY HH24:MI:SS') AND
period_start_time < to_date('16/11/2022 14:00:00','DD/MM/YYYY HH24:MI:SS');
2. report_id(ここでは RID)を指定して DBMS_AUTO_REPORT.REPORT_REPOSITORY_DETAIL を実行し、履歴 SQL Monitoring レポートを取得します。
set linesize 32767
set trimspool on
set trim on
set long 1000000
set longchunksize 1000000
set pagesize 0
spool sql_mon_hist_2556.html
SELECT dbms_auto_report.report_repository_detail(RID => 27556, TYPE => 'html') FROM dual;
spool off
注:AWR スナップショットのデフォルト間隔は 60 分で、保持期間は 8 日です。この設定を変更する必要がある場合は、dbms_workload_repository.modify_snapshot_settings を実行してください。
詳細については、My Oracle Support ドキュメント 「How To Get Historical SQL Monitor Report For SQL Statements KB96390」 を参照してください。
開発者は SQL Monitoring をどのように利用できますか?特別な権限は必要ですか?
19c 以降、データベース・ユーザーは追加の権限なしで、自身が発行した SQL 文の SQL Monitoring レポートを生成および表示できます。この場合、SQL Monitoring レポートは DBMS_SQLTUNE.REPORT_SQL_MONITOR_LIST および DBMS_SQLTUNE.REPORT_SQL_MONITOR、または Enterprise Manager Cloud Control を使用して生成できます。
ユーザーに SELECT_CATALOG_ROLE が付与されている場合は、他のユーザーが実行した SQL の SQL Monitor レポートも参照できます。
次の例では、HTML SQL Monitoring レポートを生成します(スクリプトのダウンロード)。レポートを取得するには、示されている書式情報を使用してください。
set trimspool on
set trim on
set pagesize 0
set linesize 32767
set long 1000000
set longchunksize 1000000
SELECT dbms_sqltune.report_sql_monitor(type => 'html') FROM dual;
複数の文を含む統合 SQL Monitoring レポートを生成するにはどうすればよいですか?
レポートに含めたい操作にタグ付けするだけです。これは複合データベース操作と呼ばれます。複合データベース操作とは、データベース・セッション内の 2 つの定義された時点の間で実行されるアクティビティです。現在のセッションで複合データベース操作を開始するには DBMS_SQL_MONITOR.BEGIN_OPERATION を使用し、終了するには END_OPERATION を使用します。
execute id: = dbms_sql_monitor.begin_operation(dbop_name => 'sales_job');
... operations ...
execute dbms_sql_monitor.end_operation(dbop_name => 'sales_job', dbop_eid => id);
その後、DBMS_SQL_MONITOR で DBOP_NAME の値を使用して SQL Monitoring レポートを取得します。
SELECT dbms_sql_monitor.report_sql_monitor(dbop_name =>'sales_job') FROM dual;
Real-Time SQL Monitoring で「Runaway」クエリを監視できますか?
Oracle Database Resource Manager は、セッションまたはコールが指定量を超える CPU、物理 I/O、論理 I/O、または経過時間を消費した場合にアクションを実行できます。Resource Manager は、セッションまたはコールを CPU 割当ての小さいコンシューマ・グループに切り替えるか、セッションまたはコールを終了できます。この場合、V$SQL_MONITOR には、その SQL 操作に対して Resource Manager が実行した最近のアクションが記録されます。値は CANCEL_SQL、KILL_SESSION、LOG_ONLY、SWITCH TO Consumer GROUP のいずれかです。必要な情報を取得するには、RM_LAST_ACTION、RM_LAST_ACTION_REASON、RM_LAST_ACTION_TIME、RM_CONSUMER_GROUP など、接頭辞 RM が付いた必要な列を問い合わせます。
SELECT username, elapsed_time, plsql_exec_time, sql_text, cpu_time,
rm_last_action, rm_last_action_reason, rm_last_action_time, rm_consumer_group
FROM v$sql_monitor WHERE username is not null;
USERNAME ELAPSED_TIME PLSQL_EXEC_TIME
------------------------------ ------------ ---------------
SQL_TEXT
--------------------------------------------------------------------------------
CPU_TIME RM_LAST_ACTION
---------- ------------------------------------------------
RM_LAST_ACTION_REASON RM_LAST_A RM_CONSUMER_GROUP
------------------------------ --------- ------------------------------
SH 378358 0
select /*+ use_nl(c) parallel ordered*/ count(*) from sh.sales s,sh.customers c
where c.cust_id=s.cust_id and cust_first_name='Dina'
10998 SWITCH TO OTHER_GROUPS
SWITCH_CPU_TIME 19-FEB-22 OTHER_GROUPS
26ai の新機能は何ですか?
DBA や開発者が問合せ作成時の一部の誤りを回避および特定しやすくするため、SQL 実行計画に新しいセクションが追加されました。これは SQL Analysis Report と呼ばれ、SQL 実行計画の末尾に新しいセクションとして表示されます。DBMS_XPLAN で利用できるほか、SQL アクティブ・レポートでも利用できます。
次のコード・スニペットは、SQL アクティブ・レポートでこの機能を示しています。
set trimspool on
set trim on
set pagesize 0
set linesize 32767
set long 5000000
set longchunksize 5000000
spool sql_analysis.html
select dbms_sql_monitor.report_sql_monitor(sql_id =>'b0t2n7mp41s85', report_level =>'ALL', type =>'ACTIVE') from dual;
spool off
そして、これが生成されたアクティブ・レポートです。

なお、失敗したヒントおよび成功したヒントの使用状況に関する追加情報は、自動的に追加されます(Oracle Database 19c 以降)。
詳細情報と参考資料
- Monitoring, Analyzing and Diagnosing SQL Statements in 23ai(YouTube)
- Diagnose SQL performance with DBMS_SQLDIAG(投稿)
- この投稿のすべてのスクリプト・ファイル:github.com/oracle-devrel/technology-engineering/tree/main/data-platform/core-converged-db/db-performance/sql-performance/sql-monitoring/files
- Real-Time SQL Monitoring and Oracle Database In-Memory(技術概要)
- PL/SQL パッケージおよびデータ・ディクショナリ・ビューのドキュメント
- Getting the most out of Oracle SQL Monitor(ブログ)
- How To Get Historical SQL Monitor Report For SQL Statements KB96390
- Monitoring SQL Statements with Real-Time SQL Monitoring KB135307