124 DBMS_PROFILER

このパッケージは、既存のPL/SQLアプリケーションをプロファイルし、パフォーマンス上のボトルネックを識別するためのインタフェースを提供します。またPL/SQLプロファイラ・データを収集し、永続的に保存できます。

この章のトピックは、次のとおりです:

124.1 DBMS_PROFILERの概要

このパッケージにより、収集したプロファイラ(パフォーマンス)データを使用して、パフォーマンスの向上やPL/SQLアプリケーションのコード・カバレッジの決定に役立てることができます。アプリケーション開発者は、コード・カバレッジ・データを使用して、増分テストに集中できます。

このインタフェースを使用すると、セッションで実行される指定したすべてのライブラリ・ユニットのプロファイル情報を生成できます。プロファイラは、PL/SQL仮想マシン・レベルで情報を収集します。その情報には、各行の合計実行回数、その行の実行に要した合計時間、およびその行の特定の実行に要した最小時間と最大時間が含まれています。

ノート:

データが収集されたPL/SQLユニットに関する、コード・カバレッジ値を推論することが可能です。

プロファイル情報は、データベース表に格納されています。これによってデータの問合せが可能となり、ユーザーは、カスタマイズ可能なレポート(サマリー・レポート、最新行、コード・カバレッジ・データなど)を作成できます。そして、データの分析が可能です。

PROFTAB.SQLスクリプトは、次の表にリストした列、データ・タイプおよび定義を持つ表を作成します。

表124-1 表PLSQL_PROFILER_RUNSの列

データ・タイプ 定義

runid

NUMBER PRIMARY KEY

plsql_profiler_runnumberで作成される一意の実行識別子。

related_run

NUMBER

(クライアントとサーバーの相関関係に)関連する実行の実行ID。

run_owner

VARCHAR2(128)

実行を開始したユーザー。

run_date

DATE

実行の開始時間。

run_comment

VARCHAR2(2047)

この実行に関してユーザーが指定したコメント。

run_total_time

NUMBER

この実行の経過時間(ナノ秒)。

run_system_info

VARCHAR2(2047)

未使用。

run_comment1

VARCHAR2(2047)

追加のコメント。

spare1

VARCHAR2(256)

未使用。

表124-2 表PLSQL_PROFILER_UNITSの列

データ・タイプ 定義

runid

NUMBER

主キー。plsql_profiler_runsを参照。

unit_number

NUMBER

主キー。内部的に生成されたライブラリ・ユニット番号。

unit_type

VARCHAR2(128)

ライブラリ・ユニットのタイプ。

unit_owner

VARCHAR2(128)

ライブラリ・ユニットの所有者名。

unit_name

VARCHAR2(128)

ライブラリ・ユニットにおけるライブラリ・ユニット名のタイムスタンプ。

unit_timestamp

DATE

複数実行間にユニットで発生した変更を検出するため、将来使用される予定。

total_time

NUMBER

このユニットで経過した合計時間(ナノ秒)。プロファイラはこのフィールドを設定しませんが、分析ツールで利用するために用意されています。

spare1

NUMBER

未使用。

spare2

NUMBER

未使用。

表124-3 表PLSQL_PROFILER_DATAの列

データ・タイプ 定義

runid

NUMBER

主キー。一意の(生成された)実行識別子。

unit_number

NUMBER

主キー。内部的に生成されたライブラリ・ユニット番号。

line#

NUMBER

主キー。ユニット内のNULL以外の行番号。

total_occur

NUMBER

行が実行された回数。

total_time

NUMBER

行の実行に要した合計時間(ナノ秒)。

min_time

NUMBER

この行の最小実行時間(ナノ秒)。

max_time

NUMBER

この行の最大実行時間(ナノ秒)。

spare1

NUMBER

未使用。

spare2

NUMBER

未使用。

spare3

NUMBER

未使用。

spare4

NUMBER

未使用。

Oracle Databaseのバージョン8.xには、PL/SQLデモ用スクリプトに、文脈依存のレポート・ライター(profrep.sql)のサンプルが準備されています。

Oracle Database 10gより前のバージョンでは、DBMS_PROFILERパッケージはデータベースの作成時に自動的にロードされず、パッケージの作成にはオラクル社が提供するPROFLOAD.SQLスクリプトが使用されていたことに注意してください。10g以降では、データベースの作成時にDBMS_PROFILERパッケージが自動的にロードされ、PROFLOAD.SQLは不要になりました。

124.2 DBMS_PROFILERのセキュリティ・モデル

プロファイラは、ユーザーにCREATE権限があるユニットのデータのみ収集し、EXECUTE ONLYアクセスが付与されているユニットは、このパッケージを使用してプロファイルすることはできません。通常、ユーザーがユニットをデバッグできる場合、同じユーザーがこのユニットをプロファイルできます。ただし、ユニットはDEBUGでコンパイルされているかどうかに関係なく、プロファイルできます。プロファイル対象のモジュールを、DEBUGでコンパイルすることをお薦めします(これによって、データベース内のユニットに関する追加情報が提供されます)。

ノート:

DBMS_PROFILERは、NATIVEモードでコンパイルされたプログラム・ユニットを、ユーザーにはCREATE権限がないかのように処理します。つまり、ユーザーが出力を取得することはありません。

124.3 DBMS_PROFILERの操作上のノート

これらのノートは、一般的な実行、出力の解釈方法、および例外生成の2つの方法で説明しています。

一般的な実行

アプリケーションのパフォーマンス向上は、反復プロセスです。この反復プロセスには、次のステップが伴います。

  1. プロファイラ・データの収集を行う1つ以上のベンチマーク・テストを使用して、アプリケーションを実行します。

  2. プロファイラ・データを分析し、パフォーマンス上の問題を識別します。

  3. 問題を解決します。

PL/SQLプロファイラでは、実行 という概念を使用してこのプロセスをサポートします。実行には、プロファイラ・データの収集を行うベンチマーク・テストを介した、アプリケーションの実行が含まれます。実行の開始および終了は、START_PROFILERファンクションおよびSTOP_PROFILERファンクションをコールして制御できます。

データを収集するには、ユーザーはまずプロファイラ・ユーザーのスキーマ内でデータベース表を作成する必要があります。PROFTAB.SQLスクリプトは、プロファイラ・データを継続的に格納するための表や他のデータ構造を作成します。

PROFTAB.SQLを実行すると現行の表が削除されるので、注意してください。PROFTAB.SQLスクリプトは、RDBMS/ADMINディレクトリにあります。PL/SQLユニットの初回実行など、一部のPL/SQL操作には、実行中のPL/SQLユニットにバイト・コードをロードするカタログ表へのI/Oが含まれる場合があります。また、パッケージ・プロシージャまたはファンクションの初回コール時は、パッケージ初期化コードの実行に時間がかかる場合があります。

このオーバーヘッドの時間調節を避けるために、プロファイル・データの収集前に、データベースのウォーム・アップを行います。ウォーム・アップを行うには、プロファイラ・データを収集せずにアプリケーションを1回実行します。

プロファイルは、システムの全ユーザーについて行うことができ、たとえば、あるパッケージの全ユーザーを(使用中か否かに関係なく)プロファイルできます。このような場合にSYSADMINは、変更したPROFTAB.SQLスクリプトを使用して次の内容を実行します。

  • プロファイラ表および順序を作成します。

  • これらの表および順序のSELECT/INSERT/UPDATE権限をすべてのユーザーに付与します。

  • 表および順序のパブリック・シノニムを定義します。

    ノート:

    表の実際のフィールドは変更しないでください。

一般的な実行には、次の処理が含まれます。

  • 実行でプロファイラ・データ収集を開始します。

  • プロファイラ・データおよびコード・カバレッジ・データが必要なPL/SQLコードを実行します。

  • プロファイラ・データ収集を停止します。その実行に対して収集したデータは、データベース表に書き込まれます。

    ノート:

    収集したプロファイラ・データは、ユーザーの切断時に自動的に格納されません。セッションの終了時にデータを格納するには、FLUSH_DATAファンクションまたはSTOP_PROFILERファンクションの明示的なコールを発行する必要があります。データ収集を停止すると、収集されたデータが格納されます。

アプリケーションの実行時、プロファイラ・データは、実行期間中存続するメモリー・データ構造に収集されます。実行の途中でFLUSH_DATAファンクションをコールすると、増分データを取得し、割り当てられたプロファイラ・データ構造のメモリーを解放できます。収集されたデータをフラッシュすると、その内容が前に作成したデータベース表に格納されます。

出力内容の解釈

plsql_profiler_dataに含まれる行は、コードが生成済のソース・ユニットの各行に対応しています。行番号の値でソースの行を示します。その行が存在し、total_occur値が0より大きい値である場合、その行に関連付けられたコードが実行されています。その行が存在し、total_occur値が0である場合、その行に関連付けられたコードは実行されていません。表に行が存在しない場合、その行のコードは生成されていません。したがって、レポートには記載されません。

1つの文のソースが1行に存在する場合、その文に対して生成されるコードはその行番号に関連付けられます。(単純な宣言などの場合や、最適化を行う場合、コードは不要になります)。カバレッジ情報を取得するには、ユニットはPLSQL_OPTIMIZE_LEVEL=1でコンパイルする必要があります。

1つの文が複数行にわたる場合、その文に対して生成されるコードは、範囲内にある行に関連付けられます。ただし、範囲内にあるすべての行がそれに関連付けられたコードを持つとはかぎりません。このような場合、行番号は連続していません。特に、複数行のSQL関連の文が1つの行に存在することがあります(通常は先頭)。これは、PL/SQLが、カーソルによって処理されたテキストをSQLエンジンに渡すためです。したがって、PL/SQLに関するかぎり、SQL文全体は分割できない1つの操作です。

複数の文が同じ行にある場合、プロファイラは各文の実行を結び付けます。行に制御フローが埋め込まれている場合、混乱が生じることがあります。たとえば、'then ...' 'else ...' が同じ行にある場合、'then''else'のどちらが実行されたのか判断できません。

一般的に、プロファイラおよびカバレッジ・レポートでは、1つの文が1つの行に存在する場合、解釈がより迅速に行われます。

2通りの例外生成方法

このパッケージの各ルーチンには、エラーのレポート方法が2通りあります。

  • 成功または失敗をステータス値として戻すファンクション。例外を呼び出すことはありません。

  • 成功した場合は正常に戻り、失敗した場合は例外を呼び出すプロシージャ。

いずれの場合も、ファンクションおよびプロシージャのパラメータは同じです。エラーのレポート方法のみ異なります。エラーがある場合、ファンクションが戻すエラー・コードと、プロシージャが呼び出す例外は対応しています。

次の項では、ファンクションのフォームに関する詳細を示しますが、プロシージャについても同じです。

124.4 DBMS_PROFILERの例外

DBMS_PROFILERは、このトピックで説明する例外をスローします。

表124-4 DBMS_PROFILERの例外

例外 説明

version_mismatch

error_versionに相当します。

profiler_error

"error_param"または"error_io"のいずれかに相当します。

ファンクションからの戻り値が0の場合は正常終了を示し、ゼロ以外の戻り値はエラー状態を示します。発生する可能性のあるエラーは、次のとおりです。

  • サブプログラムは不正なパラメータでコールされました。

    error_param constant binary_integer := 1; 
 
  • データ・フラッシュ操作に失敗しました。プロファイラ表が作成済でアクセス可能か、および十分な領域があるかどうかをチェックしてください。

    error_io    constant binary_integer := 2; 
 
  • パッケージとデータベースの実装に不一致があります。不適切なバージョンのDBMS_PROFILERパッケージがインストールされ、このバージョンのプロファイラ・パッケージがそのデータベース・バージョンで動作できない場合に、このエラーが戻されます。リカバリするための唯一の方法は、適切なバージョンのパッケージをインストールすることです。

    error_version constant binary_integer := -1; 

124.5 DBMS_PROFILERサブプログラムの要約

この表は、DBMS_PROFILERサブプログラムを示し、簡単に説明しています。

表124-5 DBMS_PROFILERパッケージのサブプログラム

サブプログラム 説明

FLUSH_DATAファンクションおよびプロシージャ

ユーザーのセッションで収集されたプロファイラ・データをフラッシュします。

GET_VERSIONプロシージャ

このAPIのバージョンを取得します。

INTERNAL_VERSION_CHECKファンクション

このバージョンのDBMS_PROFILERパッケージが、データベース内の実装で動作可能であることを検証します。

PAUSE_PROFILERファンクションおよびプロシージャ

プロファイラ・データ収集を一時停止します。

RESUME_PROFILERファンクションおよびプロシージャ

プロファイラ・データ収集を再開します。

START_PROFILERファンクションおよびプロシージャ

ユーザーのセッションでプロファイラ・データ収集を開始します。

STOP_PROFILERファンクションおよびプロシージャ

ユーザーのセッションでプロファイラ・データ収集を停止します。

124.5.1 FLUSH_DATAファンクションおよびプロシージャ

このファンクションは、ユーザーのセッションで収集されたプロファイラ・データをフラッシュします。データは、以前から存在しているデータベース表にフラッシュされます。

ノート:

PROFTAB.SQLスクリプトを使用して、プロファイラ・データを継続的に格納するための表や他のデータ構造を作成します。

構文

DBMS_PROFILER.FLUSH_DATA 
  RETURN BINARY_INTEGER;

DBMS_PROFILER.FLUSH_DATA;

124.5.2 GET_VERSIONプロシージャ

このプロシージャは、このAPIのバージョンを取得します。

構文

DBMS_PROFILER.GET_VERSION ( 
   major  OUT BINARY_INTEGER, 
   minor  OUT BINARY_INTEGER); 

パラメータ

表124-6 GET_VERSIONプロシージャのパラメータ

パラメータ 説明

major

DBMS_PROFILERのバージョン番号。

minor

DBMS_PROFILERのリリース番号。

124.5.3 INTERNAL_VERSION_CHECKファンクション

このファンクションは、このバージョンのDBMS_PROFILERパッケージが、データベース内の実装で動作可能であることを検証します。

構文

DBMS_PROFILER.INTERNAL_VERSION_CHECK 
  RETURN BINARY_INTEGER; 

124.5.4 PAUSE_PROFILERファンクションおよびプロシージャ

このファンクションは、プロファイラ・データ収集を一時停止します。

構文

DBMS_PROFILER.PAUSE_PROFILER 
  RETURN BINARY_INTEGER; 

DBMS_PROFILER.PAUSE_PROFILER; 

124.5.5 RESUME_PROFILERファンクションおよびプロシージャ

このファンクションは、プロファイラ・データ収集を再開します。

構文

DBMS_PROFILER.RESUME_PROFILER 
  RETURN BINARY_INTEGER; 

DBMS_PROFILER.RESUME_PROFILER; 

124.5.6 START_PROFILERファンクションおよびプロシージャ

このファンクションは、ユーザーのセッションでプロファイラ・データ収集を開始します。

START_PROFILERファンクションの2つのフォームがオーバーロードされており、1つは実行を開始した実行番号およびコール結果を戻します。もう1つは実行番号を戻しません。最初のフォームは、プロファイラを制御するGUIベースのツールで使用することを目的としています。

構文

DBMS_PROFILER.START_PROFILER(
   run_comment   IN VARCHAR2 := sysdate,
   run_comment1  IN VARCHAR2 :='',
   run_number    OUT BINARY_INTEGER)
 RETURN BINARY_INTEGER;

DBMS_PROFILER.START_PROFILER(
   run_comment IN VARCHAR2 := sysdate,
   run_comment1 IN VARCHAR2 :='')
RETURN BINARY_INTEGER;

DBMS_PROFILER.START_PROFILER(
   run_comment   IN VARCHAR2 := sysdate,
   run_comment1  IN VARCHAR2 :='',
   run_number    OUT BINARY_INTEGER);

DBMS_PROFILER.START_PROFILER(
   run_comment IN VARCHAR2 := sysdate,
   run_comment1 IN VARCHAR2 :='');

パラメータ

表124-7 START_PROFILERファンクションのパラメータ

パラメータ 説明

run_comment

実行するプロファイラごとに、コメントを指定できます。たとえば、コメントによって、データ収集で使用したベンチマーク・テストの名前およびバージョンを提供できます。

run_number

実行番号を格納します。ユーザーは実行データを格納しておき、後で再コールできます。

run_comment1

実行に関するわかりやすいコメントを記述できます。

124.5.7 STOP_PROFILERファンクションおよびプロシージャ

このファンクションは、ユーザーのセッションでプロファイラ・データ収集を停止します。

このファンクションには、セッションでそれまでに収集したデータをフラッシュする副次効果があり、これが実行の終了を示します。

構文

DBMS_PROFILER.STOP_PROFILER 
  RETURN BINARY_INTEGER; 

DBMS_PROFILER.STOP_PROFILER;