11gではある特定のSQL1文を監視することが出来ましたが、12cの新機能でリアルタイムなデータベース操作を監視することが出来るようになりました。
これを利用することである特定時点から特定時点までのコストの高いSQLを監視することが出来ます。

SQL> CREATE TABLE t1 AS
  2  SELECT level AS id,
  3  'Description for ' || level AS description
  4  FROM dual
  5  CONNECT BY level <= 1000000;

表が作成されました。

SQL> CREATE TABLE t2 AS
SELECT level AS id,
  3  'Description for ' || level AS description
  4  FROM dual
  5  CONNECT BY level <= 1000000;

表が作成されました。

テスト用のテーブルを2つ作成します。
それぞれ100万件のデータが挿入されています。

SQL> VARIABLE l_dbop_eid NUMBER;
SQL>
SQL> BEGIN
  2  :l_dbop_eid := DBMS_SQL_MONITOR.begin_operation (
  3                   dbop_name       => 'db_op_1',
  4                   dbop_eid        => :l_dbop_eid,
  5                   forced_tracking => DBMS_SQL_MONITOR.force_tracking
  6                 );
  7  END;
  8  /

PL/SQLプロシージャが正常に完了しました。


DBMS_SQL_MONITORパッケージのbegin_operationプロシージャでデータベース操作監視を開始します。
dbop_nameとdbop_eidで監視のプロセスを識別することが出来ます。

SQL> BEGIN
  2    FOR cur_rec IN (SELECT * FROM t1) LOOP
  3      NULL;
  4    END LOOP;
  5
  6    FOR cur_rec IN (SELECT * FROM t2) LOOP
  7      NULL;
  8    END LOOP;
  9  END;
 10  /

PL/SQLプロシージャが正常に完了しました。


先ほどのテーブルに対して、負荷のかかりそうなSQLを実行します。

SQL> BEGIN
  2  DBMS_SQL_MONITOR.end_operation (
  3    dbop_name       => 'db_op_1',
  4    dbop_eid        => :l_dbop_eid
  5  );
  6  END;
  7  /

PL/SQLプロシージャが正常に完了しました。


end_operationプロシージャでデータベース操作監視を終了します。

SQL> SET LINESIZE 200
SQL>
SQL> SELECT dbop_name, dbop_exec_id, status
  2  FROM   v$sql_monitor
  3  WHERE  username = 'SCOTT';

DBOP_NAME                      DBOP_EXEC_ID STATUS
------------------------------ ------------ -------------------
db_op_1                                   1 DONE


実行した監視はv$sql_monitorビューで確認できます。
statusがdoneとなっているので、監視が終了していることがわかります。

SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF

SPOOL /home/oracle/report_sql_monitor.txt
SELECT DBMS_SQL_MONITOR.report_sql_monitor(
  dbop_name    => 'db_op_1',
  type         => 'TEXT',
  report_level => 'ALL') AS report
FROM dual;
SPOOL OFF

SQL Monitoring Report

Global Information
------------------------------
 Status              :  DONE
 Instance ID         :  1
 Session             :  SCOTT (263:30551)
 DBOP Name           :  db_op_1
 DBOP Execution ID   :  1
 First Refresh Time  :  09/12/2016 00:27:02
 Last Refresh Time   :  09/12/2016 00:30:10
 Duration            :  188s
 Module/Action       :  SQL*Plus/-
 Service             :  SYS$USERS
 Program             :  sqlplus@DB01 (TNS V1-V3)

Global Stats
========================================================
| Elapsed |   Cpu   |    IO    | Buffer | Read | Read  |
| Time(s) | Time(s) | Waits(s) |  Gets  | Reqs | Bytes |
========================================================
|    3.17 |    1.67 |     1.51 |   9104 |  108 |  71MB |
========================================================


report_sql_monitorで実行したデータベース操作監視のレポートを表示しています。
実行時間とか読み込みバイト数とかが確認できます。

SPOOL /home/oracle/report_sql_monitor_list.txt
SELECT DBMS_SQL_MONITOR.report_sql_monitor_list(
  type         => 'TEXT',
  report_level => 'ALL') AS report
FROM dual;
SPOOL OFF



                                                                                SQL Monitoring List
                                                                               =====================


===================================================================================================================================================================================
|       Status        | Duration | SQL Id or DBOP Name | Exec Id  |        Start        | User  |       Module/Action        | Dop | DB Time | IOs  |          SQL Text           |
===================================================================================================================================================================================
| DONE                |     188s |       db_op_1       |    1     | 09/12/2016 00:27:02 | SCOTT | SQL*Plus/-                 |     |    3.2s |  108 |                             |
===================================================================================================================================================================================


レポートのリストはreport_sql_monitor_listで確認できます。
形式はテキストとHTMLを選ぶことが出来ます。