この章では、エンドツーエンド・アプリケーションのトレース、およびトレース・ファイルを生成および読み取る方法について説明します。
関連項目:
自動トレースを使用したSQL*Plus文のトレースおよびチューニングの詳細は、SQL*Plusユーザーズ・ガイドおよびリファレンスを参照してください
エンドツーエンド・アプリケーションのトレースでは、高負荷のSQL文などの過剰なデータベース・ワークロードのソースを、クライアント識別子、サービス、モジュール、アクション、セッション、インスタンスまたはデータベース全体によって識別できます。
複数層環境では、エンド・クライアントからの要求は中間層で別のデータベース・セッションにルーティングされるため、異なるデータベース・セッションを越えてクライアントを追跡することは困難になります。エンドツーエンド・アプリケーションのトレースは、クライアントIDを使用して、データベースへのすべての層を通じて特定のエンドクライアントを一意にトレースするインフラストラクチャで、エンド・クライアントがデータベースで実行している操作の情報を提供します。
エンドツーエンド・アプリケーションのトレースは、複数層環境のパフォーマンス上の問題の診断を単純化します。
たとえば、高負荷のSQL文などの過剰なワークロードのソースを識別でき、担当するユーザーに連絡をとることができます。また、問題が発生しているユーザーから連絡を受けることもできます。これにより、データベース・レベルで、ユーザーのセッションが何を実行しているかを識別できます。
さらに、エンドツーエンド・アプリケーションのトレースでは、あるサービスの特定のモジュールおよびアクションを追跡することで、アプリケーション・ワークロードの管理が簡素化されます。モジュール名およびアクション名は、アプリケーション開発者が設定します。たとえば、PL/SQLプログラムでこれらの値を設定するには、DBMS_APPLICATION_INFO
パッケージのSET_MODULE
およびSET_ACTION
プロシージャを使用します。
エンドツーエンド・アプリケーションのトレースでは、ワークロードの問題を次のように識別できます。
クライアント識別子: HR.HR
などのログオンIDに基づいてエンド・ユーザーを指定します。
サービス: 共通の属性、サービス・レベルのしきい値および優先順位を使用してアプリケーション・グループを指定するか、または会計アプリケーションの場合はACCTG
などのように単一アプリケーションを指定します。
モジュール: 売掛勘定または総勘定元帳など、アプリケーションの機能ブロックを指定します。
Action: モジュールのINSERT
操作やUPDATE
操作などのアクションを指定します。
セッション: 任意のデータベース・セッション識別子(SID)に基づいて、ローカル・インスタンスのセッションを指定します。
インスタンス: インスタンス名に基づいて任意のインスタンスを指定します。
SQLトレース機能およびTKPROFは、パフォーマンスを診断する2つの基本ツールで、これを使用すると、アプリケーションが実行するSQL文の効率を正確に評価できます。
最善の結果を得るには、EXPLAIN PLAN
を単体ではなくこれらのツールとともに使用してください。トレース情報がファイルに書き込まれた後、このデータをTRCSESSユーティリティで統合し、TKPROFやSQLトレースで診断できます。
エンドツーエンド・アプリケーションのトレースのためのインタフェースとして推奨されるのは、Oracle Enterprise Manager Cloud Control(Cloud Control)です。Cloud Controlを使用する場合、各コンシューマ・タイプの上位コンシューマを表示して、特定のコンシューマの統計収集およびSQLトレースを使用可能または使用禁止にできます。Cloud Controlが使用可能でない場合は、DBMS_MONITOR
APIを使用してこの機能を管理できます。
関連項目:
DBMS_MONITOR
、DBMS_SESSION
、DBMS_SERVICE
およびDBMS_APPLICATION_INFO
の各パッケージの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
SQLトレース機能は、個々のSQL文に関するパフォーマンス情報を提供します。
SQLトレースは、文単位に次の統計を生成します。
解析、実行、フェッチのカウント
CPU時間および経過時間
物理読取りおよび論理読取り
処理された行数
ライブラリ・キャッシュでのミス
それぞれの解析が行われるユーザー名
各コミットおよびロールバック
各SQL文の待機イベント・データおよび各トレース・ファイルの要約
また、SQL文のカーソルがクローズされている場合は、SQLトレースにより次の内容を含む行ソース情報が提供されます。
各SQL文の実際の実行計画を示す行操作
行数、一貫性のある読取りの数、物理読取り数、物理書込み数および行の各操作の経過時間
1つのセッションまたはインスタンスに対してSQLトレース機能を使用可能にできますが、かわりにDBMS_SESSION
またはDBMS_MONITOR
パッケージを使用することをお薦めします。セッションまたはインスタンスに対してSQLトレース機能を使用可能にすると、ユーザー・セッションまたはインスタンスで実行されるすべてのSQL文のパフォーマンス統計がトレース・ファイルに格納されます。SQLトレース機能を使用するとパフォーマンスに影響を与えることがあり、システム・オーバーヘッドの増加、過剰なCPU使用率およびディスク領域の不足をもたらす場合があります。
TRCSESSコマンドライン・ユーティリティは、セッションまたはクライアント識別子などの特定の基準に基づいて、複数のトレース・ファイルからトレース情報を統合します。
関連項目:
DBMS_SESSION
またはDBMS_MONITOR
パッケージを使用してセッションまたはインスタンスに対するSQLトレースを使用可能にする方法の詳細は、「エンドツーエンド・アプリケーションのトレースの有効化」を参照してください
PL/SQLを使用して適切な統計を収集するには、DBMS_MONITOR
のプロシージャを使用して、クライアント識別子、サービス、モジュールまたはアクションに対する統計収集を使用可能にする必要があります。デフォルト・レベルは、セッション・レベルの統計収集です。統計収集はデータベース全体を対象にしており、データベース・インスタンスの再起動後も引き続き行われます。
統計は次の基準でも収集できます。
プロシージャCLIENT_ID_STAT_ENABLE
では、特定のクライアント識別子に対する統計収集が使用可能になり、プロシージャCLIENT_ID_STAT_DISABLE
では、それが使用禁止になります。V$SESSION
のCLIENT_IDENTIFIER
列でクライアント識別子を表示できます。
前提条件
このチュートリアルでは、識別子がoe.oe
のクライアントに対する統計収集を使用可能にし、その後使用禁止にするものとします。
クライアント識別子に対する統計収集の有効化および無効化
SQL*Plusを起動し、適切な権限でデータベースに接続します。
oe.oe
に対する統計収集を使用可能にします。
たとえば、次のようなコマンドを実行します。
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_ENABLE(client_id => 'OE.OE');
oe.oe
に対する統計収集を使用禁止にします。
たとえば、次のようなコマンドを実行します。
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_DISABLE(client_id => 'OE.OE');
プロシージャSERV_MOD_ACT_STAT_ENABLE
では、サービス、モジュールおよびアクションの組合せに対する統計収集が使用可能になります。一方、プロシージャSERV_MOD_ACT_STAT_DISABLE
では、サービス、モジュールおよびアクションの組合せに対する統計収集が使用禁止になります。
前述のDBMS_MONITOR
プロシージャでモジュールまたはアクションを変更する場合、その変更は次のユーザー・コールがセッションで実行されると有効になります。たとえば、モジュールがセッションでmodule1
に設定され、そのモジュールがセッションのユーザー・コールでmodule2
にリセットされた場合、このユーザー・コールでは、モジュールはmodule1
のままです。モジュールは、セッションの次のユーザー・コールでmodule2
に変更されます。
前提条件
このチュートリアルでは、統計を次のように収集するものとします。
ACCTG
サービスに関する統計
PAYROLL
モジュール内のすべてのアクションに関する統計
GLEDGERモジュール内のINSERT
ITEM
アクションに関する統計
サービス、モジュールおよびアクションに対する統計収集を使用可能および使用禁止にする手順は次のとおりです。
SQL*Plusを起動し、適切な権限でデータベースに接続します。
目的のサービス、モジュールおよびアクションに対する統計収集を使用可能にします。
たとえば、次のコマンドを実行します。
BEGIN DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE( service_name => 'ACCTG' , module_name => 'PAYROLL' ); END; BEGIN DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE( service_name => 'ACCTG' , module_name => 'GLEDGER' , action_name => 'INSERT ITEM' ); END;
以前に指定したサービス、モジュールおよびアクションの組合せに対する統計収集を使用禁止にします。
たとえば、次のようなコマンドを実行します。
BEGIN DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE( service_name => 'ACCTG' , module_name => 'GLEDGER' , action_name => 'INSERT ITEM' ); END;
クライアント識別子、サービス、モジュール、アクション、セッション、インスタンスまたはデータベースのトレースを使用可能にするには、DBMS_MONITOR
パッケージの適切なプロシージャを実行します。次の基準により、特定の診断およびワークロード管理のトレースを使用可能にできます。
指定した基準により、特定のトレース情報がトレース・ファイルのセットに収集され、1つの出力トレース・ファイルに結合されます。
指定されたクライアント識別子に対するトレースをデータベース全体で使用可能にするには、CLIENT_ID_TRACE_ENABLE
プロシージャを使用します。CLIENT_ID_TRACE_DISABLE
プロシージャでは、データベースにおける特定のクライアント識別子のトレースが全体的に使用禁止になります。
前提条件
このチュートリアルでは、次のことが前提となっています。
OE.OE
は、SQLトレースを使用可能にするクライアント識別子です。
待機情報をトレースに含めます。
バインド情報をトレースから除外します。
クライアント識別子に対するトレースを使用可能および使用禁止にする手順は次のとおりです。
SQL*Plusを起動し、適切な権限でデータベースに接続します。
クライアントに対するトレースを使用可能にします。
たとえば、次のプログラムを実行します。
BEGIN DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE( client_id => 'OE.OE' , waits => true , binds => false ); END;
クライアントに対するトレースを使用禁止にします。
たとえば、次のコマンドを実行します。
EXECUTE DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE(client_id => 'OE.OE');
SERV_MOD_ACT_TRACE_ENABLE
プロシージャでは、データベースにおける、サービス名、モジュールおよびアクションの指定の組合せに対するSQLトレースが全体的に使用可能になります。ただし、このプロシージャでデータベース・インスタンス名が指定されている場合を除きます。SERV_MOD_ACT_TRACE_DISABLE
プロシージャでは、サービス名、モジュールおよびアクション名の指定の組合せについて、使用可能なすべてのインスタンスにおけるトレースが全体的に使用禁止になります。
前提条件
このチュートリアルでは、次のことが前提となっています。
サービスACCTG
に対するトレースを使用可能にします。
ACCTG
サービスおよびPAYROLL
モジュールの組合せに対するトレースをすべてのアクションで使用可能にします。
待機情報をトレースに含めます。
バインド情報をトレースから除外します。
inst1
インスタンスに対するトレースのみを使用可能にします。
サービス、モジュールおよびアクションに対するトレースを使用可能および使用禁止にする手順は次のとおりです。
SQL*Plusを起動し、適切な権限でデータベースに接続します。
サービス、モジュールおよびアクションに対するトレースを使用可能にします。
たとえば、次のコマンドを実行します。
BEGIN DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE( service_name => 'ACCTG' , module_name => 'PAYROLL' , waits => true , binds => false , instance_name => 'inst1' ); END;
サービス、モジュールおよびアクションに対するトレースを使用禁止にします。
たとえば、次のコマンドを実行します。
BEGIN DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE( service_name => 'ACCTG' , module_name => 'PAYROLL' , instance_name => 'inst1' ); END;
SESSION_TRACE_ENABLE
プロシージャでは、ローカル・インスタンスにおける、特定のデータベース・セッション識別子(SID)のトレースが使用可能になります。
DBMS_MONITOR
パッケージはDBAロールが付与されているユーザーのみが起動できる一方、ユーザーは、次の例のようにDBMS_SESSION.SESSION_TRACE_ENABLE
プロシージャを起動して、所有するセッションのSQLトレースを使用可能にできます。
BEGIN DBMS_SESSION.SESSION_TRACE_ENABLE( waits => true , binds => false); END;
前提条件
このチュートリアルでは、次のことが前提となっています。
データベースに管理者権限でログインする。
ユーザーOE
にアクティブなセッションが1つある。
OE
セッションに対するトレースを一時的に有効化する。
待機情報をトレースに含めます。
バインド情報をトレースから除外します。
セッションでトレースを使用可能および使用禁止にする手順は次のとおりです。
SQL*Plusを起動し、管理者権限でデータベースにログインします。
トレースするセッションの値に対するセッションIDおよびシリアル番号を調べます。
たとえば、次のようにV$SESSION
を問い合せます。
SELECT SID, SERIAL#, USERNAME FROM V$SESSION WHERE USERNAME = 'OE'; SID SERIAL# USERNAME ---------- ---------- ------------------------------ 27 60 OE
特定のセッションのトレースを使用可能にするには、前述の手順の値を使用します。
たとえば、次のプログラムを実行して、OE
セッションに対するトレースを有効化します。この場合、true
引数では待機情報がトレースに含まれ、false
引数ではバインド情報がトレースに含められません。
BEGIN DBMS_MONITOR.SESSION_TRACE_ENABLE( session_id => 27 , serial_num => 60 , waits => true , binds => false); END;
セッションに対するトレースを使用禁止にします。
SESSION_TRACE_DISABLE
プロシージャでは、特定のデータベース・セッション識別子(SID)およびシリアル番号のトレースが使用禁止になります。次に例を示します。
BEGIN DBMS_MONITOR.SESSION_TRACE_DISABLE( session_id => 27 , serial_num => 60); END;
DBMS_MONITOR.DATABASE_TRACE_ENABLE
プロシージャは、他のすべてのセッション・レベルのトレースより優先されますが、クライアント識別子、サービス、モジュールおよびアクションのトレースを補完します。トレースは現在および将来のセッションのすべてに対して使用可能になります。
すべての新規セッションは、DATABASE_TRACE_DISABLE
プロシージャがコールされるまで、このプロシージャで指定された待機およびバインド情報を継承します。instance_name
パラメータを指定してこのプロシージャを起動すると、指定されたインスタンスのセッション・レベルのSQLトレースがリセットされます。instance_name
パラメータを指定せずにこのプロシージャを起動すると、データベース全体のセッション・レベルのSQLトレースがリセットされます。
前提条件
DATABASE_TRACE_ENABLE
プロシージャを実行するには、管理者権限が必要です。
前提条件
このチュートリアルでは、次のことが前提となっています。
inst1
インスタンスのすべてのSQLに対するトレースを使用可能にします。
待機情報をトレースに含めます。
バインド情報をトレースから除外します。
セッションでトレースを使用可能および使用禁止にする手順は次のとおりです。
SQL*Plusを起動し、必要な権限でデータベースにログインします。
DATABASE_TRACE_ENABLE
プロシージャをコールして、任意のインスタンスまたはデータベース全体のSQLトレースを使用可能にします。
たとえば、次のプログラムを実行します。この場合、true
引数は、待機情報がトレースに含められることを指定し、false
引数は、バインド情報がトレースに含められないことを指定します。
BEGIN DBMS_MONITOR.DATABASE_TRACE_ENABLE( waits => true , binds => false , instance_name => 'inst1' ); END;
セッションに対するトレースを使用禁止にします。
SESSION_TRACE_DISABLE
プロシージャは、起動セッションのトレースを使用禁止にします。たとえば、次のプログラムでは、inst1
のトレースが使用禁止になります。
EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name => 'inst1');
データベース全体に対してセッション・レベルのSQLトレースを使用禁止にするには、instance_name
パラメータを指定せずにDATABASE_TRACE_DISABLE
プロシージャを起動します。
EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE();
この項では、SQLトレースとTKPROFの基本的な使用手順について説明します。
SQLトレース機能とTKPROFを使用する手順は次のとおりです。
トレース・ファイル管理用の初期化パラメータを設定します。
「手順1: トレース・ファイル管理用の初期化パラメータの設定」を参照してください。
対象とするセッションに対してSQLトレース機能を使用可能にして、アプリケーションを実行します。手順2では、アプリケーションによって発行されたSQL文に関する統計を含むトレース・ファイルが作成されます。
「手順2: SQLトレース機能を使用可能にする方法」を参照してください。
手順2で作成されるトレース・ファイルを判読可能な出力ファイルに変換するために、TKPROFを実行します。手順3ではオプションとして、データベースへの統計の格納に使用できるSQLスクリプトを作成できます。
「手順3: TKPROFでの出力ファイルの生成」を参照してください。
任意で、手順3で作成したSQLスクリプトを実行してデータベースに統計を格納します。
「手順4: SQLトレース機能統計の格納」を参照してください。
セッションに対してSQLトレース機能が使用可能になると、Oracle Databaseはトレース・ファイルを生成します。このファイルには、そのセッションでトレースされたSQL文に関する統計が記録されています。インスタンスに対してSQLトレース機能が使用可能になると、Oracle Databaseはプロセスごとに個別のトレース・ファイルを作成します。
トレース・ファイル管理用の初期化パラメータを設定する手順は次のとおりです。
表18-1
に従って、TIMED_STATISTICS
、MAX_DUMP_FILE_SIZE
およびDIAGNOSTIC_DEST初期化パラメータの設定をチェックします。
表18-1 SQLトレース機能を使用可能にする前にチェックする初期化パラメータ
パラメータ | 説明 |
---|---|
|
自動診断リポジトリ(ADR)ホームの場所を指定します。各データベース・インスタンスの診断ファイルは、この専用ディレクトリ内にあります。 |
|
SQLトレース機能がデータベース・インスタンス・レベルで使用可能になっている場合、データベースをコールするたびに、オペレーティング・システムのファイル形式を持つファイルにテキスト行が書き込まれます。これらのファイルの最大サイズ(オペレーティング・システム・ブロック単位)は、初期化パラメータによって制限されます。デフォルト値は |
|
SQLトレース機能によるCPU時間や経過時間などの時間統計の収集、および
時間計測を使用可能にすると、下位レベル操作に対する時間計測呼出しが余分に発生します。これは動的パラメータです。セッション・パラメータでもあります。 |
結果のトレース・ファイルを認識する方法を考えます。
トレース・ファイルを名前で区別できるようにしてください。SELECT
'
program_name
'
FROM
DUAL
のような文をプログラムに組み込むことによって、トレース・ファイルにタグを付けることができます。これにより、各ファイルの生成元のプロセスを追跡できます。
TRACEFILE_IDENTIFIER
初期化パラメータを設定し、トレース・ファイル名の一部となるカスタム識別子も指定できます(TRACEFILE_IDENTIFIER初期化パラメータについては、『Oracle Databaseリファレンス』を参照してください)。たとえば、次の文によって、後続のトレース・ファイル名に
my_trace_id
を追加し、識別しやすくできます。
ALTER SESSION SET TRACEFILE_IDENTIFIER = 'my_trace_id';
オペレーティング・システムがファイルの複数のバージョンを保持している場合、SQLトレース機能が生成するトレース・ファイルの数に対して、バージョンの上限が十分に高い値に設定されていることを確認してください。
生成されたトレース・ファイルを自分以外のオペレーティング・システム・ユーザーが所有できる場合、TKPROFを使用してそれらをフォーマットするために必要な権限があることを確認します。
データベース・インスタンス
DBMS_MONITOR.DATABASE_TRACE_ENABLE
プロシージャを使用してトレースを使用可能にし、DBMS_MONITOR.DATABASE_TRACE_DISABLE
プロシージャを使用してトレースを使用禁止にします。
データベース・セッション
DBMS_SESSION.SET_SQL_TRACE
プロシージャを使用して、トレースを使用可能(true
)または使用禁止(false
)にします。
注意:
SQLトレース機能を実行するとシステムのオーバーヘッドが増加するため、この機能はSQL文をチューニングするときにのみ使用可能にし、チューニングが終了してから使用禁止にしてください。
データベース・インスタンス・レベルでトレースを使用可能および使用禁止にする手順は次のとおりです。
SQL*Plusを起動し、管理者権限でデータベースに接続します。
データベース・インスタンス・レベルでトレースを使用可能にします。
次の例では、orcl
インスタンスに対するトレースを使用可能にします。
EXEC DBMS_MONITOR.DATABASE_TRACE_ENABLE(INSTANCE_NAME => 'orcl');
トレースする文を実行します。
データベース・インスタンスに対するトレースを使用禁止にします。
次の例では、orcl
インスタンスに対するトレースを使用禁止にします。
EXEC DBMS_MONITOR.DATABASE_TRACE_DISABLE(INSTANCE_NAME => 'orcl');
セッション・レベルでトレースを使用可能および使用禁止にする手順は次のとおりです。
SQL*Plusを起動し、必要な資格証明を使用してデータベースに接続します。
現行のセッションに対するトレースを使用可能にします。
次の例では、現行のセッションに対するトレースを使用可能にします。
EXEC DBMS_SESSION.SET_SQL_TRACE(sql_trace => true);
トレースする文を実行します。
現行のセッションに対するトレースを使用禁止にします。
次の例では、現行のセッションに対するトレースを使用禁止にします。
EXEC DBMS_SESSION.SET_SQL_TRACE(sql_trace => false);
関連項目:
DBMS_MONITOR.DATABASE_TRACE_ENABLEの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
TKPROFは、SQLトレース機能によって生成されたトレース・ファイルを入力として受け入れ、フォーマットされた出力ファイルを生成します。TKPROFは、実行計画も生成します。
SQLトレース機能によってトレース・ファイルが生成されると、次を実行できるようになります。
トレース・ファイルごとにTKPROFを実行して、フォーマットされた出力ファイルを各セッションに1つずつ作成できます。
トレース・ファイルを連結し、その結果のファイルに対してTKPROFを実行して、インスタンス全体のフォーマットされた出力ファイルを生成できます。
TRCSESSコマンドライン・ユーティリティを実行して複数のトレース・ファイルからトレース情報を統合し、結果に対してTKPROFを実行します。
TKPROFは、トレース・ファイルに記録されているCOMMIT
文およびROLLBACK
文をレポートしません。
Example 18-1 TKPROF出力
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno; call count cpu elapsed disk query current rows ---- ------- ------- --------- -------- -------- ------- ------ Parse 1 0.16 0.29 3 13 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.03 0.26 2 2 4 14 Misses in library cache during parse: 1 Parsing user id: (8) SCOTT Rows Execution Plan ------- ---------------------------------------------------
14 MERGE JOIN 4 SORT JOIN 4 TABLE ACCESS (FULL) OF 'DEPT' 14 SORT JOIN 14 TABLE ACCESS (FULL) OF 'EMP'
TKPROFは、トレース・ファイルのユーザー・レベル文と再帰的SQLコールの要約も提供します。
SQLトレース機能によって生成されたアプリケーションに関する統計の履歴を保持し、別の時点でこれらの統計を比較することがあります。TKPROF
は、表を作成して、統計の行をその表に挿入するSQLスクリプトを生成します。このスクリプトには、次の内容が記述されています。
TKPROF_TABLE
という出力表を作成するCREATE
TABLE
文
トレースしたSQL文ごとに統計行を1行ずつTKPROF_TABLE
に追加するINSERT
文
TKPROF
の実行後にこのスクリプトを実行すると、統計がデータベースに格納されます。
次のCREATE
TABLE
文はTKPROF_TABLE
を作成します。
CREATE TABLE TKPROF_TABLE (
DATE_OF_INSERT DATE, CURSOR_NUM NUMBER, DEPTH NUMBER, USER_ID NUMBER, PARSE_CNT NUMBER, PARSE_CPU NUMBER, PARSE_ELAP NUMBER, PARSE_DISK NUMBER, PARSE_QUERY NUMBER, PARSE_CURRENT NUMBER, PARSE_MISS NUMBER, EXE_COUNT NUMBER, EXE_CPU NUMBER, EXE_ELAP NUMBER, EXE_DISK NUMBER, EXE_QUERY NUMBER, EXE_CURRENT NUMBER, EXE_MISS NUMBER, EXE_ROWS NUMBER, FETCH_COUNT NUMBER, FETCH_CPU NUMBER, FETCH_ELAP NUMBER, FETCH_DISK NUMBER, FETCH_QUERY NUMBER, FETCH_CURRENT NUMBER, FETCH_ROWS NUMBER, CLOCK_TICKS NUMBER, SQL_STATEMENT LONG);
出力表のほとんどの列は、フォーマットされた出力ファイルに記録されている統計と直接対応しています。たとえば、PARSE_CNT
列の値は出力ファイルの解析ステップに関するカウント統計に対応しています。
表18-2の列は、統計が入っている行を識別する際に役立ちます。
表18-2 統計の行を識別するTKPROF_TABLE列
列 | 説明 |
---|---|
|
SQLトレース機能が収集した統計行の対象となるSQL文です。この列には |
|
行が表に挿入された日時です。この値は、SQLトレース機能が統計を収集した時間とは異なります。 |
|
SQL文が発行された再帰レベルを示します。たとえば、値0はユーザーがその文を発行したことを示します。値1は、Oracle Databaseが値0の文(ユーザー発行の文)を処理するために再帰的コールとしてその文を生成したことを示します。値nは、Oracle Databaseが値n-1の文を処理する再帰的コールとしてその文を生成したことを示します。 |
|
この文を発行するユーザーを識別します。この値はフォーマットした出力ファイルにも出力されます。 |
|
Oracle Databaseでは、この列の値を使用して、各SQL文が割り当てられたカーソルの追跡を行います。 |
文の実行計画は出力表に格納されません。次の問合せは、出力表からの統計を返します。これらの統計は、例18-7で示したフォーマットされた出力に対応します。
SELECT * FROM TKPROF_TABLE;
出力例は次のように表示されます。
DATE_OF_INSERT CURSOR_NUM DEPTH USER_ID PARSE_CNT PARSE_CPU PARSE_ELAP -------------- ---------- ----- ------- --------- --------- ---------- 21-DEC-2012 1 0 8 1 16 22 PARSE_DISK PARSE_QUERY PARSE_CURRENT PARSE_MISS EXE_COUNT EXE_CPU ---------- ----------- ------------- ---------- --------- ------- 3 11 0 1 1 0 EXE_ELAP EXE_DISK EXE_QUERY EXE_CURRENT EXE_MISS EXE_ROWS FETCH_COUNT -------- -------- --------- ----------- -------- -------- ----------- 0 0 0 0 0 0 1 FETCH_CPU FETCH_ELAP FETCH_DISK FETCH_QUERY FETCH_CURRENT FETCH_ROWS --------- ---------- ---------- ----------- ------------- ---------- 2 20 2 2 4 10 SQL_STATEMENT --------------------------------------------------------------------- SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO
この項では、TKPROF
出力を解釈するためのガイドラインを示します。
TKPROF
は有用な分析を提供しますが、効率の最も正確なメジャーは、アプリケーションのパフォーマンスです。TKPROF
出力の最後の部分は、トレース実行期間中にプロセスが実行した作業のサマリーです。
時間統計の精度は、100分の1秒です。このため、100分の1秒以下で終了するカーソル操作の時間は正しく計測されない場合があります。統計を解読するときには、この制限を覚えておいてください。非常に高速に実行する単純な問合せの結果を解読するときには特に注意してください。
ユーザーが発行したSQL文を実行するために、Oracle Databaseは内部的に追加のSQL文を発行する必要があります。そのような文は、再帰的コールまたは再帰的SQLと呼ばれます。たとえば、セッションで十分な領域のない表に行を挿入しようとすると、データベースは再帰的コールを実行して動的に領域を割り当てます。データベースでは、データ・ディクショナリの情報がメモリーにないため、ディスクから取り出す必要がある場合にも、再帰的コールが生成されます。
SQLトレース機能が使用可能になっているときに、再帰的コールが発生すると、TKPROF
は再帰的SQL文の統計を生成し、出力ファイルで再帰的SQL文を明確に示します。SYS
コマンドライン・パラメータをNO
に設定して、出力ファイルへのOracle Database内部再帰的コール(たとえば、領域管理)のリスト表示を抑止できます。再帰的SQL文の統計は、再帰的コールを発生させたSQL文のリストでなく、再帰的SQL文のリストに表示されます。したがって、SQL文の処理に必要なリソースの合計を計算するときは、その文自体の統計と、その文によって生じる再帰的コールの統計を考慮する必要があります。
注意:
再帰的SQL統計は、SQLレベルの操作には組み込まれません。
どのSQL文によって大部分のCPUまたはディスク・リソースが使用されるかを確認する必要があります。TIMED_STATISTICS
パラメータが使用可能になっている場合は、CPUの高いアクティビティをCPU
列で見つけられます。TIMED_STATISTICS
が使用可能になっていない場合は、QUERY
およびCURRENT
列をチェックしてください。
ロックの問題と効率の悪いPL/SQLループを除いて、問題の文を発見するためにはCPU時間と経過時間のどちらも必要ありません。重要なのは、問合せモード(すなわち、読取り一貫性の対象)と現行モード(読取り一貫性の非対象)の両方でアクセスするブロックの数です。セグメント・ヘッダーと更新されるブロックは現行モードで獲得されますが、すべての問合せ処理と副問合せ処理は問合せモードでデータを要求します。これらのメジャーは、インスタンス統計CONSISTENT
GETS
およびDB
BLOCK
GETS
とまったく同じです。高ディスク・アクティビティはディスク
列で見つけられます。
次のリストには、あるSQL文のTKPROF
出力が出力ファイルに表示されるときと同じ状態で示されています。:
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno; call count cpu elapsed disk query current rows ---- ------- ------- --------- -------- -------- ------- ------ Parse 11 0.08 0.18 0 0 0 0 Execute 11 0.23 0.66 0 3 6 0 Fetch 35 6.70 6.83 100 12326 2 824 ------------------------------------------------------------------ total 57 7.01 7.67 100 12329 8 826 Misses in library cache during parse: 0
7.01 CPU秒で、824行を取り出せる場合は、これ以上このトレース出力を検索する必要はありません。事実上、チューニング作業でのTKPROF
レポートの主な用途は、詳細なチューニング段階のプロセスを排除することです。
この出力では、1つの文に対して11の解析コールが存在していたため、10の不要な解析コールが作成され、その配列フェッチ操作が実行されたことを確認できます。フェッチで取り出された行よりも多くの行がフェッチされました。CPU
時間と経過
時間の大きなギャップは、物理I/Oの存在を示します。
関連項目:
この項では、TKPROF
の解釈における細かなポイントをいくつか説明します。
実行時にバインドされる値を認識していない場合は、引数トラップに陥る可能性があります。EXPLAIN PLAN
は、SQL文のテキストからバインド変数の型を判断できないので、型は常にVARCHAR
であると想定されます。バインド変数が実際には番号または日付である場合、TKPROF
が暗黙的データ変換を行い、その結果、効率の悪い計画が実行される可能性があります。この状況を回避するには、異なるデータ型を使用して問合せを試み、独自に変換を実行します。
次の例は、読取り一貫性トラップを示しています。コミットされていないトランザクションがNAME
列に一連の更新を行ったことを知らないと、多くのブロックがアクセスされる理由を判断することは非常に困難です。
通常、このようなケースは再現可能ではありません。そのプロセスが再度実行された場合に、別のトランザクションが同じようにそのプロセスに影響を及ぼすことはあまりありません。
SELECT name_id FROM cq_names WHERE name = 'FLOOR'; call count cpu elapsed disk query current rows ---- ----- --- ------- ---- ----- ------- ---- Parse 1 0.10 0.18 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.11 0.21 2 101 0 1 Misses in library cache during parse: 1 Parsing user id: 01 (USER1) Rows Execution Plan e---- --------- ---- 0 SELECT STATEMENT 1 TABLE ACCESS (BY ROWID) OF 'CQ_NAMES' 2 INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON_UNIQUE)
この例は極端な場合を示しているので、スキーマ・トラップは容易に検出できます。最初は、明らかに単純に索引付けされた問合せが多くのデータベース・ブロックを検索する必要がある理由、または現行モードでブロックにアクセスすることが必要な理由を理解することは困難です。
SELECT name_id FROM cq_names WHERE name = 'FLOOR'; call count cpu elapsed disk query current rows -------- ------- -------- --------- ------- ------ ------- ---- Parse 1 0.06 0.10 0 0 0 0 Execute 1 0.02 0.02 0 0 0 0 Fetch 1 0.23 0.30 31 31 3 1 Misses in library cache during parse: 0 Parsing user id: 02 (USER2) Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT 2340 TABLE ACCESS (BY ROWID) OF 'CQ_NAMES' 0 INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON-UNIQUE)
2つの統計は、問合せが全表スキャンを使用して実行された可能性があることを示しています。これらの統計は、現行モードでのブロック・アクセスと、実行計画のTable Access行ソースに由来する行数です。これは、トレース・ファイルが生成された後、TKPROF
が実行される前に、必要な索引が構築されたことを示しています。
新規トレース・ファイルを生成すると次のデータが与えられます。
SELECT name_id FROM cq_names WHERE name = 'FLOOR'; call count cpu elapsed disk query current rows ----- ------ ------ -------- ----- ------ ------- ----- Parse 1 0.01 0.02 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.00 0.00 0 2 0 1 Misses in library cache during parse: 0 Parsing user id: 02 (USER2) Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT 1 TABLE ACCESS (BY ROWID) OF 'CQ_NAMES' 2 INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON-UNIQUE)
この正しいバージョンで注目する機能の1つは、解析コールには10ミリ秒のCPU時間と20ミリ秒の経過時間を要する一方で、問合せとフェッチの実行にはまったく時間がかかっていないことです。これらの例外的事態が発生するのは、10ミリ秒というクロック刻みがデータの実行およびフェッチに要する時間と比べて非常に長いためです。このような場合、文を多く実行して統計的に有効な数値を得ることが重要になります。
次の例で示すように、特定の問合せに長時間かかる理由がわからないことがあります。
UPDATE cq_names SET ATTRIBUTES = lower(ATTRIBUTES) WHERE ATTRIBUTES = :att call count cpu elapsed disk query current rows -------- ------- -------- --------- -------- -------- ------- ---------- Parse 1 0.06 0.24 0 0 0 0 Execute 1 0.62 19.62 22 526 12 7 Fetch 0 0.00 0.00 0 0 0 0 Misses in library cache during parse: 1 Parsing user id: 02 (USER2) Rows Execution Plan ------- --------------------------------------------------- 0 UPDATE STATEMENT 2519 TABLE ACCESS (FULL) OF 'CQ_NAMES'
ここでも、別のトランザクションによる妨害というのが答えです。この場合は、別のトランザクションが更新を発行する前後の数秒間、表cq_names
で共有ロックが保持されています。妨害の影響が発生していることを診断できるようになるにはかなりの経験が必要です。一方で、妨害によって発生する遅延が短時間である(または前の例のようにブロック・アクセスにおける増加がわずかである)場合は、比較用のデータが必要です。ただし、妨害によるオーバーヘッドが少なく、本質的に文が効率的である場合は、統計を分析する必要はありません。
TRCSESSユーティリティでは、次の複数の基準に基づいて、選択されたトレース・ファイルからのトレース出力が統合されます。TRCSESSによりトレース情報が1つの出力ファイルにマージされると、TKPROFは出力ファイルを処理できます。
TRCSESSは、パフォーマンスまたはデバッグを向上させるため、特定のセッションのトレースを統合する際に便利です。
特定のセッションのトレースは、専用サーバー・モデルでは、1つのプロセスが存続期間中ずっと1つのセッションに対応するため、通常は問題になりません。このセッションのトレース情報は、このセッションに対応するサーバー処理に属するトレース・ファイルで参照できます。ただし、共有サーバー構成では、時間の経過とともにユーザー・セッションが様々なプロセスで対応されます。ユーザー・セッションのトレースは、様々なプロセスに属する各種トレース・ファイル間で分散されるため、1つのセッションのライフサイクル全体を把握することが困難です。
session
、clientid
、service
、action
またはmodule
オプションのいずれかを指定する必要があります。複数のオプションを指定する場合、TRCSESSにより、指定した基準に基づいてすべてのトレース・ファイルが出力ファイルに統合されます。
trcsess [output=output_file_name] [session=session_id] [clientid=client_id] [service=service_name] [action=action_name] [module=module_name] [trace_files]
引数 | 説明 |
---|---|
|
出力の生成場所となるファイルを指定します。このオプションを指定しない場合、標準出力に書き込まれます。 |
|
指定されたセッションのトレース情報を統合します。セッション識別子は、セッション索引とセッション・シリアル番号の組合せ( |
|
指定されたクライアント識別子のトレース情報を統合します。 |
|
指定されたサービス名のトレース情報を統合します。 |
|
指定されたアクション名のトレース情報を統合します。 |
|
指定されたモジュール名のトレース情報を統合します。 |
|
TRCSESSでトレース情報を検索するトレース・ファイル名(スペースで区切る)を表示します。トレース・ファイル名の指定にワイルドカード文字( |
例18-2 単一のセッションに対するトレース
このTRCSESSの出力例は、特定のセッションにおけるトレースのコンテナを示しています。この例では、セッション索引およびシリアル番号は21.2371
となります。現在のディレクトリのすべてのファイルが入力データとみなされます。
trcsess session=21.2371
例18-3 複数のトレース・ファイルの指定
次の例では、トレース・ファイルを2つ指定します。
trcsess session=21.2371 main_12359.trc main_12995.trc
出力例は次のようになります。
[PROCESS ID = 12359] *** 2014-04-02 09:48:28.376 PARSING IN CURSOR #1 len=17 dep=0 uid=27 oct=3 lid=27 tim=868373970961 hv=887450622 ad='22683fb4' select * from cat END OF STMT PARSE #1:c=0,e=339,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=868373970944 EXEC #1:c=0,e=221,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=868373971411 FETCH #1:c=0,e=791,p=0,cr=7,cu=0,mis=0,r=1,dep=0,og=4,tim=868373972435 FETCH #1:c=0,e=1486,p=0,cr=20,cu=0,mis=0,r=6,dep=0,og=4,tim=868373986238 *** 2014-04-02 10:03:58.058 XCTEND rlbk=0, rd_only=1 STAT #1 id=1 cnt=7 pid=0 pos=1 obj=0 op='FILTER ' STAT #1 id=2 cnt=7 pid=1 pos=1 obj=18 op='TABLE ACCESS BY INDEX ROWID OBJ$ ' STAT #1 id=3 cnt=7 pid=2 pos=1 obj=37 op='INDEX RANGE SCAN I_OBJ2 ' STAT #1 id=4 cnt=0 pid=1 pos=2 obj=4 op='TABLE ACCESS CLUSTER TAB$J2 ' STAT #1 id=5 cnt=6 pid=4 pos=1 obj=3 op='INDEX UNIQUE SCAN I_OBJ# ' [PROCESS ID=12995] *** 2014-04-02 10:04:32.738 Archiving is disabled
TKPROFプログラムは、トレース・ファイルの内容をフォーマットし、判読可能なファイルとして出力します。
TKPROFは次のことも実行します。
統計をデータベースに格納するSQLスクリプトを作成します。
SQL文の実行計画を判断します。
注意:
SQL文のカーソルがクローズされていない場合、SQL文の実際の実行計画がTKPROF出力に自動的に含まれることはありません。この場合は、TKPROFでEXPLAIN
オプションを使用して、実行計画を生成します。
TKPROFは、実行した各文を、消費したリソースおよびコールした回数、処理した行数とともにレポートします。
tkprof input_file output_file [ waits=yes|no ] [ sort=option ] [ print=n ] [ aggregate=yes|no ] [ insert=filename3 ] [ sys=yes|no ] [ table=schema.table ] [ explain=user/password ] [ record=filename4 ] [ width=n ]
TKPROFは多くのコマンドライン・オプションをサポートします。
表18-3 TKPROFの引数
引数 | 説明 |
---|---|
|
入力ファイル、つまりSQLトレース機能によって生成された統計を収録しているトレース・ファイルを指定します。このファイルは、単一のセッションに対して生成されたトレース・ファイル、または複数のセッションの個々のトレース・ファイルを結合して生成したファイルのどちらでもかまいません。 |
|
|
|
トレース・ファイル内の待機イベントのサマリーを記録するかどうかを指定します。有効な値は |
|
トレースしたSQL文のリストを出力ファイルに作成する前に、指定したソート・オプションに基づいて降順にソートします。複数のオプションが指定されている場合、出力はソート・オプションに指定されている値の合計によって降順にソートされます。このパラメータを指定しないと、
|
|
出力ファイルから最初に整数でソートされたSQL文のみのリストを作成します。このパラメータを指定しないと、 |
|
|
|
トレース・ファイルの統計をデータベースに格納するSQLスクリプトを作成します。 |
|
ユーザー |
|
実行計画が出力ファイルに書き込まれる前に、 指定されたユーザーは、表に対して このオプションを指定すると、
PLAN TABLEが存在しない場合、 |
|
トレース・ファイルの各SQL文の実行計画を判断して、これらの実行計画を出力ファイルに書き込みます。
注意: インスタンスの始動直後に生成されたトレース・ファイルは、スタートアップ・プロセスのアクティビティを反映するデータを含みます。特に、これらは、システム・グローバル領域(SGA)のキャッシュがいっぱいになったときの不均衡な量のI/Oアクティビティを反映します。チューニングを行うときには、このようなトレース・ファイルは無視してください。 |
|
トレース・ファイル内の非再帰的SQL文をすべて収録したSQLスクリプトを、指定した |
|
EXPLAIN PLANなど、一部の |
この項では、TKPROFの出力について説明します。
TKPROF
は、各SQL文を発行したユーザーのユーザーIDを出力します。SQLトレース入力ファイルに複数のユーザーからの統計が含まれ、文が複数のユーザーによって発行された場合、TKPROF
は、文を解析した最後のユーザーのIDを出力します。すべてのデータベース・ユーザーのユーザーIDは、列ALL_USERS
.USER_ID
のデータ・ディクショナリに表示されます。
TKPROF
は、SQLトレース機能によって戻されるSQL文の統計のリストを行と列に作成します。各行は、SQL文を処理する3つのステップの1つに対応します。統計は、次に示すCALL
列の値によって識別されます。表18-4を参照してください。
表18-4 CALL列の値
CALLの値 | 意味 |
---|---|
|
適切なセキュリティ認可のチェック、および表、列、その他の参照オブジェクトの存在のチェックを行ってSQL文を実行計画に変換します。 |
|
Oracle Databaseによる実際の文の実行です。 |
|
問合せを満たす行を取得します。フェッチは、 |
SQLトレース機能の出力におけるその他の列は、すべての文の解析、実行、フェッチについての統計です。query
とcurrent
の合計が、アクセスされたバッファの総数となります。これは論理I/O(LIO)とも呼ばれます。表18-5を参照してください。
表18-5 解析、実行およびフェッチのSQLトレース統計
処理された行に関する統計は、ROWS
列に表示されます。この列は、SQL文によって処理される行数を示します。この値には、SQL文の副問合せによって処理された行は含まれません。SELECT
文の場合、戻された行数はフェッチ・ステップに表示されます。UPDATE
文、DELETE
文およびINSERT
文の場合、処理された行数は実行ステップに表示されます。
注意:
行ソースの件数は、カーソルがクローズされたときに表示されます。SQL*Plusでは、ユーザー・カーソルは1つしかないため、文が実行されるたびに直前のカーソルがクローズされます。これにより、行ソースの件数が表示されます。PL/SQLには、独自のカーソル処理方法があり、親カーソルがクローズされても子カーソルはクローズされません。終了(または再接続)によって、件数が表示されます。
TKPROF
は、各SQL文の解析ステップと実行ステップの結果として生じるライブラリ・キャッシュ・ミス回数のリストも作成します。これらの統計は、表形式の統計に続く別の行に表示されます。文でライブラリ・キャッシュ・ミスが発生しなかった場合、TKPROF
はその統計のリストを作成しません。「例」における解析ステップでは、ライブラリ・キャッシュ・ミスが1回発生し、実行ステップではライブラリ・キャッシュ・ミスは発生しませんでした。
TKPROF出力の行ソースの操作では、行に対して実行される各操作で処理される行数と、物理読取りおよび書込みなど、行ソースの追加情報が提供されます。
表18-6 行ソースの操作
行ソースの操作 | 意味 |
---|---|
|
行ソースにより実行される一貫性のある読取り。 |
|
行ソースにより実行される物理読取り。 |
|
行ソースにより実行される物理書込み。 |
|
時間(マイクロ秒)。 |
次のサンプルのTKPROF
出力で、行ソース操作列内のcr
、r
、w
およびtime
の値をメモしておきます。
Rows Row Source Operation ------- --------------------------------------------------- 0 DELETE (cr=43141 r=266947 w=25854 time=60235565 us) 28144 HASH JOIN ANTI (cr=43057 r=262332 w=25854 time=48830056 us) 51427 TABLE ACCESS FULL STATS$SQLTEXT (cr=3465 r=3463 w=0 time=865083 us) 647529 INDEX FAST FULL SCAN STATS$SQL_SUMMARY_PK (cr=39592 r=39325 w=0 time=10522877 us) (object id 7409)
待機イベント情報が存在する場合、TKPROF
出力には次のようなセクションが含まれます。
Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ db file sequential read 8084 0.12 5.34 direct path write 834 0.00 0.00 direct path write temp 834 0.00 0.05 db file parallel read 8 1.53 5.51 db file scattered read 4180 0.07 1.45 direct path read 7082 0.00 0.05 direct path read temp 7082 0.00 0.44 rdbms ipc reply 20 0.00 0.01 SQL*Net message to client 1 0.00 0.00 SQL*Net message from client 1 0.00 0.00
さらに、ファイルの最後でトレース・ファイル全体について待機イベントが要約されます。
待機イベント情報がそのセッションのトレース・ファイルに確実に書き込まれるようにするには、次のSQL文を実行します。
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
例18-4 最もリソース集中型の文の印刷
SORT
パラメータとPRINT
パラメータの組合せを使用して大規模なトレース・ファイルを処理する場合は、リソースを最も多く使用する文のみを含むTKPROF
出力ファイルを生成できます。次の文は、トレース・ファイルに格納されている、ほとんどの物理I/Oを生成した10個の文を印刷します。
TKPROF ora53269.trc ora53269.prf SORT = (PRSDSK, EXEDSK, FCHDSK) PRINT = 10
例18-5 SQLスクリプトの生成
この例では、TKPROF
を実行して、examp12_jane_fg_sqlplus_007
.trc
という名前のトレース・ファイルを取り込み、outputa
.prf
という名前のフォーマット済の出力ファイルに書き込みます。
TKPROF examp12_jane_fg_sqlplus_007.trc OUTPUTA.PRF EXPLAIN=hr TABLE=hr.temp_plan_table_a INSERT=STOREA.SQL SYS=NO SORT=(EXECPU,FCHCPU)
この例は、スクリーン上で複数行にわたって表示される可能性があるので、使用しているオペレーティング・システムによっては継続文字を使用する必要があります。
この例で使用されている他のパラメータに注意してください。
EXPLAIN
の値によって、TKPROF
がユーザーhr
として接続され、トレースされた各SQL文の実行計画を生成するためにEXPLAIN
PLAN
文が使用されます。これを使用してアクセス・パスおよび行ソース行数を取得できます。
注意:
SQL文のカーソルがクローズされていない場合、SQL文の実際の実行計画がTKPROF
出力に自動的に含まれることはありません。この場合は、TKPROF
でEXPLAIN
オプションを使用して、実行計画を生成できます。
TABLE
の値によって、TKPROF
がスキーマscott
の表temp_plan_table_a
を一時的なPLAN TABLEとして使用します。
INSERT
の値によって、TKPROF
がトレースされたすべてのSQL文に関する統計をデータベース内に格納するSQLスクリプト、STOREA
.SQL
を生成します。
SYS
パラメータに値NO
が指定されていることにより、TKPROF
は出力ファイルに再帰的SQL文のリストを作成しません。このため、一時表操作などのOracle Databaseの内部の文は無視できます。
SORT
の値によって、TKPROF
はSQL文を出力ファイルに書き込む前に、SQL文の実行にかかったCPU時間と行のフェッチにかかったCPU時間の合計値の順にSQL文をソートします。効率を最大にするためには、SORT
パラメータを常に使用してください。
例18-6 TKPROFヘッダー
この例では、TKPROFレポートに対するサンプル・ヘッダーを示します。
TKPROF: Release 12.1.0.0.2 Copyright (c) 1982, 2012, Oracle and/or its affiliates. All rights reserved. Trace file: /disk1/oracle/log/diag/rdbms/orcla/orcla/trace/orcla_ora_917.trc Sort options: default ******************************************************************************** count = number of times OCI procedure was executed cpu = cpu time in seconds executing elapsed = elapsed time in seconds executing disk = number of physical reads of buffers from disk query = number of buffers gotten for consistent read current = number of buffers gotten in current mode (usually for update) rows = number of rows processed by the fetch or execute call ********************************************************************************
例18-7 TKPROF本体
この例では、TKPROFレポートに対するサンプル・ボディを示します。
call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 0.01 0.00 0 0 0 0 Misses in library cache during parse: 1 Optimizer mode: FIRST_ROWS Parsing user id: 44 Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ SQL*Net message to client 1 0.00 0.00 SQL*Net message from client 1 28.59 28.59 ******************************************************************************** select condition from cdef$ where rowid=:1 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.00 0.00 0 2 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 3 0.00 0.00 0 2 0 1 Misses in library cache during parse: 1 Optimizer mode: CHOOSE Parsing user id: SYS (recursive depth: 1) Rows Row Source Operation ------- --------------------------------------------------- 1 TABLE ACCESS BY USER ROWID OBJ#(31) (cr=1 r=0 w=0 time=151 us) ******************************************************************************** SELECT last_name, job_id, salary FROM employees WHERE salary = (SELECT max(salary) FROM employees) call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.02 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 2 0.00 0.00 0 15 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.02 0.01 0 15 0 1 Misses in library cache during parse: 1 Optimizer mode: FIRST_ROWS Parsing user id: 44 Rows Row Source Operation ------- --------------------------------------------------- 1 TABLE ACCESS FULL EMPLOYEES (cr=15 r=0 w=0 time=1743 us) 1 SORT AGGREGATE (cr=7 r=0 w=0 time=777 us) 107 TABLE ACCESS FULL EMPLOYEES (cr=7 r=0 w=0 time=655 us) Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ SQL*Net message to client 2 0.00 0.00 SQL*Net message from client 2 9.62 9.62 ******************************************************************************** ******************************************************************************** delete from stats$sqltext st where (hash_value, text_subset) not in (select --+ hash_aj hash_value, text_subset from stats$sql_summary ss where ( ( snap_id < :lo_snap or snap_id > :hi_snap ) and dbid = :dbid and instance_number = :inst_num ) or ( dbid != :dbid or instance_number != :inst_num) ) call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 29.60 60.68 266984 43776 131172 28144 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 29.60 60.68 266984 43776 131172 28144 Misses in library cache during parse: 1 Misses in library cache during execute: 1 Optimizer mode: CHOOSE Parsing user id: 22 Rows Row Source Operation ------- --------------------------------------------------- 0 DELETE (cr=43141 r=266947 w=25854 time=60235565 us) 28144 HASH JOIN ANTI (cr=43057 r=262332 w=25854 time=48830056 us) 51427 TABLE ACCESS FULL STATS$SQLTEXT (cr=3465 r=3463 w=0 time=865083 us) 647529 INDEX FAST FULL SCAN STATS$SQL_SUMMARY_PK (cr=39592 r=39325 w=0 time=10522877 us) (object id 7409) Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ db file sequential read 8084 0.12 5.34 direct path write 834 0.00 0.00 direct path write temp 834 0.00 0.05 db file parallel read 8 1.53 5.51 db file scattered read 4180 0.07 1.45 direct path read 7082 0.00 0.05 direct path read temp 7082 0.00 0.44 rdbms ipc reply 20 0.00 0.01 SQL*Net message to client 1 0.00 0.00 SQL*Net message from client 1 0.00 0.00 ********************************************************************************
例18-8 TKPROFのサマリー
この例では、TKPROFレポートに対するサマリーを示します。
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 4 0.04 0.01 0 0 0 0 Execute 5 0.00 0.04 0 0 0 0 Fetch 2 0.00 0.00 0 15 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 11 0.04 0.06 0 15 0 1 Misses in library cache during parse: 4 Misses in library cache during execute: 1 Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ SQL*Net message to client 6 0.00 0.00 SQL*Net message from client 5 77.77 128.88 OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.00 0.00 0 2 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 3 0.00 0.00 0 2 0 1 Misses in library cache during parse: 1 5 user SQL statements in session. 1 internal SQL statements in session. 6 SQL statements in session. ******************************************************************************** Trace file: main_ora_27621.trc Trace file compatibility: 9.00.01 Sort options: default 1 session in tracefile. 5 user SQL statements in trace file. 1 internal SQL statements in trace file. 6 SQL statements in trace file. 6 unique SQL statements in trace file. 76 lines in trace file. 128 elapsed seconds in trace file.
このセクションでは、次のトピックについて説明します。
収集した統計情報は、次のV$
ビューおよびデータ・ディクショナリ・ビューで表示できます。
収集した統計情報は、次のV$
ビューで表示できます。
DBA_ENABLED_AGGREGATIONS
ビューは、現在使用可能になっている統計に対して収集されたグローバルな統計を表示します。
V$CLIENT_STATS
ビューは、特定のクライアント識別子に対して収集された統計を表示します。
V$SERVICE_STATS
ビューは、特定のサービスに対して収集された統計を表示します。
V$SERV_MOD_ACT_STATS
ビューは、指定されたサービス、モジュールおよびアクションの組合せに対して収集された統計を表示します。
V$SERVICEMETRIC
ビューは、データベース・コールの経過時間とCPUの使用に対して収集された統計を表示します。
関連項目:
V$
ビューおよびデータ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。