DBMS_profILERシステムパッケージは、PL中の各行の実行状況を記録し、結果を集計して、PL実行プロセスにおける各ステートメントの実行時間を詳細に表示します。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
説明
V4.4.x系では、V4.4.2バージョンから、DBMS_PROFILERシステムパッケージを有効にすると、PLのディスクキャッシュを再利用できます。
DBMS_PROFILER権限の説明
このシステムパッケージ権限は AUTHID CURRENT_USER です。
サブプログラムの概要
次の表は、OceanBaseデータベースの現在のバージョンでサポートされている DBMS_PROFILER サブプログラムとその簡単な説明を示しています。
サブプログラム |
説明 |
|---|---|
| start_profiler | パフォーマンスプロファイラーを起動します。起動後、現在のセッション上でのPLの実行状況を記録します。 |
| stop_profiler | パフォーマンスプロファイラーを停止します。停止後、結果はデータ統計テーブルに集約されます。 |
| pause_profiler | パフォーマンスプロファイラーを一時停止します。一時停止後、実行状況の記録が一時的に停止します。 |
| resume_profiler | パフォーマンスプロファイラーを再開し、実行状況の記録を再開します。 |
| flush_data | データをデータ統計テーブルに集約します。 |
| get_version | 現在のDBMS_PROFILERバージョンを返します。 |
| internal_version_check | データベースバージョンとDBMS_PROFILERバージョンが一致するかどうかを確認します。 |
| rollup_unit | 特定の実行における特定ユニットの実行時間を計算します。 |
| rollup_run | 特定の実行における各ユニットの実行時間を計算します。 |
| ob_init_objects | ユーザーschema配下にデータ統計テーブルを作成します。 |
| ob_drop_objects | ユーザーschema配下からデータ統計テーブルを削除します。 |
呼び出しの流れ
DBMS_PROFILER.start_profiler を呼び出してプロファイラーを起動します。その後、このセッション内で実行されるすべてのPLの各行の実行回数と実行時間が記録されます。システムのウォームアップが必要な場合、ウォームアッププロセスが記録されないようにするために、DBMS_PROFILER.pause_profiler でプロファイラーを一時停止し、システムのウォームアップが完了したら DBMS_PROFILER.resume_profiler で実行状況の記録を再開します。システムでパフォーマンス分析が必要なPLの実行が終了したら、DBMS_PROFILER.stop_profiler を呼び出してプロファイラーを閉じます。記録されたすべてのデータは統計テーブルに集約され、その統計テーブルをクエリすることでパフォーマンスを分析します。
以下の図のように:

使用例
ストアドプロシージャPROC1を作成します。
obclient> CREATE OR REPLACE PROCEDURE PROC1 AS BEGIN NULL; END; /ストアドプロシージャPROC0を作成します。
obclient> CREATE OR REPLACE PROCEDURE PROC0 AS BEGIN PROC1(); END; /パフォーマンス分析ツールを起動します。
obclient> CALL DBMS_PROFILER.start_profiler();PROC0ストアドプロシージャを呼び出します。
obclient> CALL PROC0();PROC0ストアドプロシージャを実行します。パフォーマンス分析ツールが既に起動しているため、この呼び出しのデータは収集され、後の分析に使用されます。
パフォーマンス分析ツールを閉じます。
obclient> CALL DBMS_PROFILER.stop_profiler();パフォーマンス分析の実行情報を確認します。
obclient> SELECT * FROM PLSQL_PROFILER_RUNS;実行結果:
+-------+-------------+-----------+-----------+-------------+----------------+-----------------+--------------+--------+ | RUNID | RELATED_RUN | RUN_OWNER | RUN_DATE | RUN_COMMENT | RUN_TOTAL_TIME | RUN_SYSTEM_INFO | RUN_COMMENT1 | SPARE1 | +-------+-------------+-----------+-----------+-------------+----------------+-----------------+--------------+--------+ | 1 | NULL | SYS | 10-JAN-25 | 10-JAN-25 | 34000000000 | NULL | NULL | NULL | +-------+-------------+-----------+-----------+-------------+----------------+-----------------+--------------+--------+ 1 row in set (0.002 sec)分析対象ユニットの情報を確認します。
obclient> SELECT * FROM PLSQL_PROFILER_UNITS;実行結果:
+-------+-------------+-----------+------------+-----------+----------------+------------+--------+--------+ | RUNID | UNIT_NUMBER | UNIT_TYPE | UNIT_OWNER | UNIT_NAME | UNIT_TIMESTAMP | TOTAL_TIME | SPARE1 | SPARE2 | +-------+-------------+-----------+------------+-----------+----------------+------------+--------+--------+ | 1 | 500025 | PROCEDURE | SYS | PROCL | 10-JAN-25 | 0 | NULL | NULL | | 1 | 500026 | PROCEDURE | SYS | PROC0 | 10-JAN-25 | 0 | NULL | NULL | +-------+-------------+-----------+------------+-----------+----------------+------------+--------+--------+ 2 rows in set (0.004 sec)PLSQL_PROFILER_UNITSテーブルから、分析された各PL/SQLユニットの関連情報(ユニットタイプ、名前、合計時間など)を取得します。個々の行レベルのパフォーマンスデータを確認します。
obclient> SELECT * FROM PLSQL_PROFILER_DATA;実行結果:
+-------+-------------+-------+-------------+------------+----------+----------+--------+--------+--------+--------+ | RUNID | UNIT_NUMBER | LINE# | TOTAL_OCCUR | TOTAL_TIME | MIN_TIME | MAX_TIME | SPARE1 | SPARE2 | SPARE3 | SPARE4 | +-------+-------------+-------+-------------+------------+----------+----------+--------+--------+--------+--------+ | 1 | 500025 | 1 | 1 | 537 | 537 | 537 | NULL | NULL | NULL | NULL | | 1 | 500025 | 3 | 1 | 7118 | 7118 | 7118 | NULL | NULL | NULL | NULL | | 1 | 500026 | 1 | 1 | 406 | 406 | 406 | NULL | NULL | NULL | NULL | | 1 | 500026 | 3 | 1 | 16031017 | 16031017 | 16031017 | NULL | NULL | NULL | NULL | +-------+-------------+-------+-------------+------------+----------+----------+--------+--------+--------+--------+ 4 rows in set (0.002 sec)PLSQL_PROFILER_DATAテーブルをクエリすることで、各PL/SQLユニット内の特定行の詳細なパフォーマンス統計を確認できます。これには、その行の実行回数、合計実行時間、最小・最大実行時間などが含まれます。