23 アプリケーション・トレースの実行
この章では、エンドツーエンド・アプリケーションのトレースとは何か、およびトレース・ファイルの生成と読取りの方法について説明しています。
この章のトピックは、次のとおりです:
関連項目:
自動トレースを使用したSQL*Plus文のトレースおよびチューニングについて学習するには、SQL*Plusユーザーズ・ガイドおよびリファレンスを参照してください
23.1 エンドツーエンド・アプリケーションのトレースの概要
エンドツーエンド・アプリケーションのトレースでは、高負荷のSQL文などの過剰なデータベース・ワークロードのソースを、クライアント識別子、サービス、モジュール、アクション、セッション、インスタンスまたはデータベース全体によって識別できます。
複数層環境では、エンド・クライアントからの要求は中間層で別のデータベース・セッションにルーティングされるため、異なるデータベース・セッションを越えてクライアントを追跡することは困難になります。エンドツーエンド・アプリケーションのトレースは、クライアントIDを使用して、データベースへのすべての層を通じて特定のエンドクライアントを一意にトレースするインフラストラクチャで、エンド・クライアントがデータベースで実行している操作の情報を提供します。
この項では、次の項目について説明します。
23.1.1 エンドツーエンド・アプリケーションのトレースの目的
エンドツーエンド・アプリケーションのトレースで、複数層環境のパフォーマンス上の問題の診断が容易になります。
たとえば、高負荷のSQL文などの過剰なデータベース・ワークロードのソースを識別でき、担当するユーザーに連絡をとることができます。また、問題が発生しているユーザーから連絡を受けることもできます。これにより、非CDBまたはPDBレベルで、ユーザーのセッションが何を実行しているかを識別できます。
さらに、エンドツーエンド・アプリケーションのトレースでは、あるサービスの特定のモジュールおよびアクションを追跡することで、アプリケーション・ワークロードの管理が容易になります。モジュール名およびアクション名は、アプリケーション開発者が設定します。たとえば、PL/SQLプログラムでこれらの値を設定するには、DBMS_APPLICATION_INFO
パッケージのSET_MODULE
およびSET_ACTION
プロシージャを使用します。
エンドツーエンド・アプリケーションのトレースでは、データベースのワークロードの問題を次のように識別できます。
-
クライアント識別子
HR.HR
などのログオンIDに基づいてエンド・ユーザーを指定します -
サービス
共通の属性、サービス・レベルのしきい値および優先順位を持つアプリケーション・グループを指定するか、または会計アプリケーションの場合は
ACCTG
などのように単一アプリケーションを指定します。 -
モジュール
売掛勘定または総勘定元帳など、アプリケーションの機能ブロックを指定します
-
アクション
モジュールの
INSERT
操作やUPDATE
操作などのアクションを指定します -
セッション
任意のデータベース・セッション識別子(SID)に基づいて、ローカル・インスタンスのセッションを指定します
-
インスタンス
インスタンス名に基づいて特定のデータベース・インスタンスを指定します
-
コンテナ
CDB内のコンテナを指定します
23.1.2 マルチテナント環境のエンドツーエンド・アプリケーションのトレース
Oracle Database 12cリリース2 (12.2)から、CDB内のコンテナに接続されている場合に、新しいV$
ビューによりそのコンテナに固有のトレース・ファイルへの読取りアクセスが可能です。
主なユースケースは、次のとおりです。
-
CDB管理者が特定のPDBからのトレースを表示する必要がある。
V$DIAG_TRACE_FILE
ビューは、ADRトレース・ディレクトリにある、特定のPDBからのトレース・データを含むすべてのトレース・ファイルのリストを示します。V$DIAG_TRACE_FILE_CONTENTS
が、トレース・ファイルの内容を表示します。 -
PDB管理者が特定のPDBからのトレースを表示する必要がある。
SQLトレースを使用して、PDBアプリケーションで実行しているSQL文の診断データを収集できます。トレース・データには、SQLトレース(イベント10046)およびオプティマイザ・トレース(イベント10053)が含まれます。
V$
ビューを使用すると、開発者は、トレース・ファイル全体にアクセスせずにSQLのみ、またはオプティマイザ・トレース・レコードにアクセスできます。
どのPDBがファイルまたはファイルの一部と関連付けられているかをユーザーおよびツールが判断できるように、トレース・ファイル、インシデント・ダンプおよびログ・ファイルにPDB注釈が存在します。PDB情報は、各トレース・ファイルの.trm
ファイルに格納された構造化メタデータの一部です。各レコードが次の属性を取得します。
-
CON_ID
。データと関連付けられたコンテナのIDです -
CON_UID
。コンテナの一意のIDです -
NAME
。コンテナの名前です
関連項目:
23.1.3 エンドツーエンド・アプリケーションのトレースのツール
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パッケージおよびタイプ・リファレンスを参照してください
23.1.3.1 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トレースを使用可能にする方法を学習するには、「エンドツーエンド・アプリケーションのトレースの有効化」を参照してください
23.2 エンドツーエンド・トレースにおける統計収集の有効化
PL/SQLを使用して適切な統計を収集するには、DBMS_MONITOR
のプロシージャを使用して、クライアント識別子、サービス、モジュールまたはアクションに対する統計収集を使用可能にする必要があります。
デフォルト・レベルは、セッション・レベルの統計収集です。統計収集はデータベース全体を対象にしており、データベース・インスタンスの再起動後も引き続き行われます。
統計は次の基準でも収集できます。
23.2.1 クライアント識別子に対する統計収集の有効化
プロシージャ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');
23.2.2 サービス、モジュールおよびアクションに対する統計収集の有効化
プロシージャ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;
23.3 エンドツーエンド・アプリケーションのトレースの有効化
クライアント識別子、サービス、モジュール、アクション、セッション、インスタンスまたはデータベースのトレースを使用可能にするには、DBMS_MONITOR
パッケージの適切なプロシージャを実行します。
指定した基準により、特定のトレース情報がトレース・ファイルのセットに収集され、1つの出力トレース・ファイルに結合されます。次の基準により、特定の診断およびワークロード管理のトレースを使用可能にできます。
関連項目:
トレース・ファイルの場所を確認する方法の詳細は、Oracle Database管理者ガイドを参照してください
23.3.1 クライアント識別子に対するトレースの有効化
指定されたクライアント識別子に対するトレースをデータベース全体で使用可能にするには、DBMS_MONITOR.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');
23.3.2 サービス、モジュールおよびアクションに対するトレースの有効化
DBMS_MONITOR.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;
23.3.3 セッションに対するトレースの有効化
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;
23.3.4 インスタンスまたはデータベースに対するトレースの有効化
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;
-
トレースを無効化します。
DATABASE_TRACE_DISABLE
プロシージャは、トレースを無効化します。たとえば、次のプログラムでは、inst1
のトレースが使用禁止になります。EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name => 'inst1');
データベース全体に対してSQLトレースを無効化するには、
instance_name
パラメータを指定せずにDATABASE_TRACE_DISABLE
プロシージャを起動します。EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE();
23.4 SQLトレースおよびTKPROFを使用した出力ファイルの生成
この項では、SQLトレースとTKPROFの基本的な使用手順について説明します。
出力ファイルの生成手順は次のとおりです。
-
トレース・ファイル管理用の初期化パラメータを設定します。
「ステップ1: トレース・ファイル管理用の初期化パラメータの設定」を参照してください。
-
対象とするセッションに対してSQLトレース機能を使用可能にして、アプリケーションを実行します。ステップ2では、アプリケーションによって発行されたSQL文に関する統計を含むトレース・ファイルが作成されます。
「ステップ2: SQLトレース機能を使用可能にする方法」を参照してください。
-
ステップ2で作成されるトレース・ファイルを判読可能な出力ファイルに変換するために、TKPROFを実行します。ステップ3ではオプションとして、データベースへの統計の格納に使用できるSQLスクリプトを作成できます。
「ステップ3: TKPROFでの出力ファイルの生成」を参照してください。
-
任意で、ステップ3で作成したSQLスクリプトを実行してデータベースに統計を格納します。
「ステップ4: SQLトレース機能統計の格納」を参照してください。
この項では、次の項目について説明します。
23.4.1 ステップ1: トレース・ファイル管理用の初期化パラメータの設定
トレース・ファイルを有効にするには、必ず特定の初期化パラメータを設定する必要があります。
セッションに対してSQLトレース機能が使用可能になると、Oracle Databaseはトレース・ファイルを生成します。このファイルには、そのセッションでトレースされたSQL文に関する統計が記録されています。インスタンスに対してSQLトレース機能が使用可能になると、Oracle Databaseはプロセスごとに個別のトレース・ファイルを作成します。
トレース・ファイル管理用の初期化パラメータを設定するには:
-
「表23-1」に従って、
TIMED_STATISTICS
、MAX_DUMP_FILE_SIZE
およびDIAGNOSTIC_DEST
初期化パラメータの設定をチェックします。表23-1 SQLトレース機能を有効にする前にチェックする初期化パラメータ
パラメータ 説明 DIAGNOSTIC_DEST
自動診断リポジトリ(ADR)ホームの場所を指定します。各データベース・インスタンスの診断ファイルは、この専用ディレクトリ内にあります。
MAX_DUMP_FILE_SIZE
SQLトレース機能がデータベース・インスタンス・レベルで使用可能になっている場合、データベースをコールするたびに、オペレーティング・システムのファイル形式を持つファイルにテキスト行が書き込まれます。これらのファイルの最大サイズ(オペレーティング・システム・ブロック単位)は、初期化パラメータによって制限されます。デフォルト値は
UNLIMITED
です。TIMED_STATISTICS
SQLトレース機能によるCPU時間や経過時間などの時間統計の収集、および
V$
ビューの中の様々な統計の収集を使用可能または使用禁止にできます。STATISTICS_LEVEL
をTYPICAL
またはALL
に設定した場合、TIMED_STATISTICS
のデフォルト値はtrue
になります。STATISTICS_LEVEL
をBASIC
に設定した場合、TIMED_STATISTICS
のデフォルト値はfalse
になります。時間計測を使用可能にすると、下位レベル操作に対する時間計測呼出しが余分に発生します。これは動的パラメータです。セッション・パラメータでもあります。
-
結果のトレース・ファイルを認識する方法を考えます。
トレース・ファイルを名前で区別できるようにしてください。
SELECT
などの文をプログラムに組み込むことによって、トレース・ファイルにタグを付けることができます。これにより、各ファイルの生成元のプロセスを追跡できます。program_name
' FROM DUALTRACEFILE_IDENTIFIER
初期化パラメータを設定し、トレース・ファイル名の一部となるカスタム識別子も指定できます。たとえば、次の文によって、後続のトレース・ファイル名にmy_trace_id
を追加し、識別しやすくできます。ALTER SESSION SET TRACEFILE_IDENTIFIER = 'my_trace_id';
-
オペレーティング・システムがファイルの複数のバージョンを保持している場合、SQLトレース機能が生成するトレース・ファイルの数に対して、バージョンの上限が十分に高い値に設定されていることを確認してください。
-
生成されたトレース・ファイルを自分以外のオペレーティング・システム・ユーザーが所有できる場合、TKPROFを使用してそれらをフォーマットするために必要な権限があることを確認します。
関連項目:
-
DIAGNOSTIC_DEST
、STATISTICS_LEVEL
、TIMED_STATISTICS
、およびTRACEFILE_IDENTIFIER
初期化パラメータについて学習するには、『Oracle Databaseリファレンス』を参照してください -
トレース・ファイルのサイズを制御する方法を学習するには、Oracle Database管理者ガイドを参照してください
23.4.2 ステップ2: SQLトレース機能を使用可能にする方法
SQLトレース機能は、インスタンス・レベルまたはセッション・レベルで有効にできます。
使用するパッケージは、レベルによって異なります。
-
データベース・インスタンス
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パッケージおよびタイプ・リファレンスを参照してください
23.4.3 ステップ3: TKPROFでの出力ファイルの生成
TKPROFは、SQLトレース機能によって生成されたトレース・ファイルを入力として受け入れ、フォーマットされた出力ファイルを生成します。TKPROFは、実行計画も生成します。
SQLトレース機能によってトレース・ファイルが生成されると、次を実行できるようになります。
-
トレース・ファイルごとにTKPROFを実行して、フォーマットされた出力ファイルを各セッションに1つずつ作成できます。
-
トレース・ファイルを連結し、その結果のファイルに対してTKPROFを実行して、インスタンス全体のフォーマットされた出力ファイルを生成できます。
-
TRCSESSコマンドライン・ユーティリティを実行して複数のトレース・ファイルからトレース情報を統合し、結果に対してTKPROFを実行します。
TKPROFは、トレース・ファイルに記録されているCOMMIT
文およびROLLBACK
文をレポートしません。
ノート:
次のSQL文は、SQLトレース・ファイルで25文字に切り捨てられます。
SET ROLE
GRANT
ALTER USER
ALTER ROLE
CREATE USER
CREATE ROLE
Example 23-1 TKPROF Output
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トレース統計
-
文の解析と実行におけるライブラリ・キャッシュ・ミスの回数。
-
文を最初に解析したユーザー。
-
EXPLAIN PLAN
によって生成された実行計画
TKPROFは、トレース・ファイルのユーザー・レベル文と再帰的SQLコールの要約も提供します。
23.4.4 ステップ4: SQLトレース機能統計の格納
SQLトレース機能によって生成されたアプリケーションに関する統計の履歴を保持し、別の時点でこれらの統計を比較することがあります。
TKPROF
は、表を作成して、統計の行をその表に挿入するSQLスクリプトを生成します。このスクリプトの内容は次のとおりです。
-
TKPROF_TABLE
という出力表を作成するCREATE TABLE
文 -
トレースしたSQL文ごとに統計行を1行ずつ
TKPROF_TABLE
に追加するINSERT
文
TKPROF
の実行後にこのスクリプトを実行すると、統計がデータベースに格納されます。
この項では、次の項目について説明します。
23.4.4.1 TKPROFによる出力SQLスクリプトの生成
TKPROF
を実行する場合は、INSERT
パラメータを使用して、生成されるSQLスクリプトの名前を指定します。
INSERT
パラメータを指定しないと、TKPROF
はスクリプトを生成しません。
23.4.4.2 TKPROFによる出力SQLスクリプトの編集
TKPROF
によってSQLスクリプトが作成された後、SQLスクリプトを実行する前にスクリプトを編集できます。
以前に収集した統計の出力表が作成され、新しい統計をこの表に追加する場合は、スクリプトからCREATE TABLE
文を削除します。これにより、スクリプトが新しい行を既存の表に挿入します。異なるデータベースの統計を別々の表に格納するためなど、複数の出力表を作成している場合は、CREATE TABLE
文とINSERT
文を編集して、出力表の名前を変更してください。
23.4.4.3 出力表の問合せ
出力表を作成したら、SELECT
文を使用して問い合せます。
次の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
列の値は出力ファイルの解析ステップに関するカウント統計に対応しています。
次の表の列は、統計の行を識別する際に役立ちます。
表23-2 統計の行を識別するTKPROF_TABLE列
列 | 説明 |
---|---|
|
SQLトレース機能が収集した統計行の対象となるSQL文です。この列には |
|
行が表に挿入された日時です。この値は、SQLトレース機能が統計を収集した時間とは異なります。 |
|
SQL文が発行された再帰レベルを示します。たとえば、値0はユーザーがその文を発行したことを示します。値1は、Oracle Databaseが値0の文(ユーザー発行の文)を処理するために再帰的コールとしてその文を生成したことを示します。値nは、Oracle Databaseが値n-1の文を処理する再帰的コールとしてその文を生成したことを示します。 |
|
この文を発行するユーザーを識別します。この値はフォーマットした出力ファイルにも出力されます。 |
|
Oracle Databaseでは、この列の値を使用して、各SQL文が割り当てられたカーソルの追跡を行います。 |
文の実行計画は出力表に格納されません。次の問合せは、出力表からの統計を返します。これらの統計は、例23-7で示したフォーマットされた出力に対応します。
SELECT * FROM TKPROF_TABLE;
出力例は次のように表示されます。
DATE_OF_INSERT CURSOR_NUM DEPTH USER_ID PARSE_CNT PARSE_CPU PARSE_ELAP
-------------- ---------- ----- ------- --------- --------- ----------
21-DEC-2017 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
23.5 TKPROF出力の解釈のガイドライン
TKPROF
は有用な分析を提供しますが、効率の最も正確なメジャーは、アプリケーションのパフォーマンスです。TKPROF
出力の最後の部分は、トレース実行期間中にプロセスが実行した作業のサマリーです。
この項では、次の項目について説明します。
23.5.1 統計の精度を解釈するためのガイドライン
時間統計の精度は、100分の1秒です。このため、100分の1秒以下で終了するカーソル操作の時間は正しく計測されない場合があります。
統計を解釈するときには、この時間の制限を覚えておいてください。非常に高速に実行する単純な問合せの結果を解読するときには特に注意してください。
23.5.2 再帰的SQL文に関するガイドライン
再帰的SQLは、ユーザーが発行したSQL文を実行するためにOracle Databaseが発行する必要がある追加のSQLです。
概念上、再帰的SQLは副次的なSQLです。たとえば、セッションで十分な領域のない表に行を挿入しようとすると、データベースは再帰的SQLコールを実行して動的に領域を割り当てます。データベースでは、データ・ディクショナリの情報がメモリーにないため、ディスクから取り出す必要がある場合にも、再帰的コールが生成されます。
SQLトレース機能が使用可能になっているときに、再帰的コールが発生すると、TKPROF
は再帰的SQL文の統計を生成し、出力ファイルで再帰的SQL文を明確に示します。SYS
コマンドライン・パラメータをNO
に設定して、出力ファイルへのOracle Database内部再帰的コール(たとえば、領域管理)のリスト表示を抑止できます。再帰的SQL文の統計は、再帰的コールを発生させたSQL文のリストでなく、再帰的SQL文のリストに表示されます。したがって、SQL文の処理に必要なリソースの合計を計算するときは、その文自体の統計と、その文によって生じる再帰的コールの統計を考慮する必要があります。
ノート:
再帰的SQL統計は、SQLレベルの操作には組み込まれません。
23.5.3 チューニングする文の決定に関するガイドライン
どの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の存在を示します。
関連項目:
23.5.4 TKPROFの解釈におけるトラップを回避するためのガイドライン
TKPROF
の出力を解釈するときには、一般的なトラップを認識していると役立ちます。
この項では、次の項目について説明します。
23.5.4.1 引数トラップを回避するためのガイドライン
実行時にバインドされる値を認識していない場合は、引数トラップに陥る可能性があります。
EXPLAIN PLAN
は、SQL文のテキストからバインド変数の型を判断できないので、型は常にVARCHAR
であると想定されます。バインド変数が実際には番号または日付である場合、TKPROF
が暗黙的データ変換を行い、その結果、効率の悪い計画が実行される可能性があります。この状況を回避するには、異なるデータ型を使用して問合せを試み、独自に変換を実行します。
23.5.4.2 読取り一貫性トラップを回避するためのガイドライン
コミットされていないトランザクションが列に対して一連の更新を行ったことを知らないと、多くのブロックがアクセスされる理由を判断することは困難です。
通常、このようなケースは再現可能ではありません。そのプロセスが再度実行された場合に、別のトランザクションが同じようにそのプロセスに影響を及ぼすことはあまりありません。
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
---- --------- ----
0 SELECT STATEMENT
1 TABLE ACCESS (BY ROWID) OF 'CQ_NAMES'
2 INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON_UNIQUE)
23.5.4.3 スキーマ・トラップを回避するためのガイドライン
明らかに単純に索引付けされた問合せが、多数のデータベース・ブロックを参照し、現行モードでアクセスすることがあります。
次の例は極端な場合を示しているので、スキーマ・トラップは容易に検出できます。
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)
現行モードでのブロック・アクセスと、計画のTable Access行ソースに由来する行数の2つの統計は、問合せが全表スキャンを使用して実行された可能性があることを示しています。これは、トレース・ファイルが生成された後、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)
正しいバージョンでは、解析コールには10ミリ秒のCPU時間と20ミリ秒の経過時間を要していますが、問合せとフェッチの実行にはまったく時間がかかっていません。これらの例外的事態が発生するのは、10ミリ秒というクロック刻みがデータの実行およびフェッチに要する時間と比べて非常に長いためです。このような場合、文を多く実行して統計的に有効な数値を得ることが重要になります。
23.5.4.4 タイム・トラップを回避するためのガイドライン
問合せに非常に長い時間がかかることがあります。
たとえば、次の7行の更新は19秒で実行されます。
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
で共有ロックが保持されています。妨害の影響が発生していることを診断できるようになるには経験が必要です。一方で、妨害によって発生する遅延が短時間である(または前の例のようにブロック・アクセスにおける増加がわずかである)場合は、比較用のデータが必要です。ただし、妨害によるオーバーヘッドが少なく、本質的に文が効率的である場合は、統計を分析する必要はありません。
23.6 アプリケーション・トレース・ユーティリティ
Oracleトレース・ユーティリティはTKPROFとTRCSESSです。
この項では、次のユーティリティの構文およびセマンティクスについて説明します。
23.6.1 TRCSESS
TRCSESSユーティリティでは、次の複数の基準に基づいて、選択されたトレース・ファイルからのトレース出力が統合されます。
TRCSESSによりトレース情報が1つの出力ファイルにマージされると、TKPROFは出力ファイルを処理できます。この項では、次の項目について説明します。
23.6.1.1 目的
TRCSESSは、パフォーマンスまたはデバッグを向上させるため、特定のセッションのトレースを統合する際に便利です。
特定のセッションのトレースは、専用サーバー・モデルでは、1つのプロセスが存続期間中ずっと1つのセッションに対応するため、通常は問題になりません。このセッションのトレース情報は、このセッションに対応するサーバー処理に属するトレース・ファイルで参照できます。ただし、共有サーバー構成では、時間の経過とともにユーザー・セッションが様々なプロセスで対応されます。ユーザー・セッションのトレースは、様々なプロセスに属する各種トレース・ファイル間で分散されるため、1つのセッションのライフサイクル全体を把握することが困難です。
23.6.1.2 ガイドライン
session
、clientid
、service
、action
またはmodule
オプションのいずれかを指定する必要があります。
複数のオプションを指定する場合、TRCSESSにより、指定した基準に基づいてすべてのトレース・ファイルが出力ファイルに統合されます。
23.6.1.3 構文
trcsess [output=output_file_name]
[session=session_id]
[clientid=client_id]
[service=service_name]
[action=action_name]
[module=module_name]
[trace_files]
23.6.1.4 オプション
TRCSESSは多くのコマンドライン・オプションをサポートします。
引数 | 説明 |
---|---|
|
出力の生成場所となるファイルを指定します。このオプションを指定しない場合、標準出力に書き込まれます。 |
|
指定されたセッションのトレース情報を統合します。セッション識別子は、セッション索引とセッション・シリアル番号の組合せ( |
|
指定されたクライアント識別子のトレース情報を統合します。 |
|
指定されたサービス名のトレース情報を統合します。 |
|
指定されたアクション名のトレース情報を統合します。 |
|
指定されたモジュール名のトレース情報を統合します。 |
|
TRCSESSでトレース情報を検索するトレース・ファイル名(スペースで区切る)を表示します。トレース・ファイル名の指定にワイルドカード文字( |
23.6.1.5 例
この項では、TRCSESSの一般的なユースケースを示します。
例23-2 単一のセッションに対するトレース
このTRCSESSの出力例は、特定のセッションにおけるトレースのコンテナを示しています。この例では、セッション索引およびシリアル番号は21.2371
となります。現在のディレクトリのすべてのファイルが入力データとみなされます。
trcsess session=21.2371
例23-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
23.6.2 TKPROF
TKPROFプログラムは、トレース・ファイルの内容をフォーマットし、判読可能なファイルとして出力します。
TKPROFは、次も実行できます。
-
統計をデータベースに格納するSQLスクリプトを作成します。
-
SQL文の実行計画を判断します。
ノート:
SQL文のカーソルがクローズされていない場合、SQL文の実際の実行計画がTKPROF出力に自動的に含まれることはありません。この場合は、TKPROFで
EXPLAIN
オプションを使用して、実行計画を生成します。
TKPROFは、実行した各文を、消費したリソースおよびコールした回数、処理した行数とともにレポートします。
この項では、次の項目について説明します。
23.6.2.3 構文
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 ]
23.6.2.4 オプション
TKPROFは多くのコマンドライン・オプションをサポートします。
表23-3 TKPROFの引数
引数 | 説明 |
---|---|
|
入力ファイル、つまりSQLトレース機能によって生成された統計を収録しているトレース・ファイルを指定します。このファイルは、単一のセッションに対して生成されたトレース・ファイル、または複数のセッションの個々のトレース・ファイルを結合して生成したファイルのどちらでもかまいません。 |
|
|
|
トレース・ファイル内の待機イベントのサマリーを記録するかどうかを指定します。有効な値は |
|
トレースしたSQL文のリストを出力ファイルに作成する前に、指定したソート・オプションに基づいて降順にソートします。複数のオプションが指定されている場合、出力はソート・オプションに指定されている値の合計によって降順にソートされます。このパラメータを指定しないと、
|
|
出力ファイルから最初に整数でソートされたSQL文のみのリストを作成します。このパラメータを指定しないと、 |
|
|
|
トレース・ファイルの統計をデータベースに格納するSQLスクリプトを作成します。 |
|
ユーザー |
|
実行計画が出力ファイルに書き込まれる前に、 指定されたユーザーは、表に対して このオプションを指定すると、複数のユーザーが
PLAN TABLEが存在しない場合、 |
|
トレース・ファイルの各SQL文の実行計画を判断して、これらの実行計画を出力ファイルに書き込みます。
ノート: インスタンスの始動直後に生成されたトレース・ファイルは、スタートアップ・プロセスのアクティビティを反映するデータを含みます。特に、これらは、システム・グローバル領域(SGA)のキャッシュがいっぱいになったときの不均衡な量のI/Oアクティビティを反映します。チューニングを行うときには、このようなトレース・ファイルは無視してください。 |
|
トレース・ファイル内の非再帰的SQL文をすべて収録したSQLスクリプトを、指定した |
|
EXPLAIN PLANなど、一部の |
23.6.2.5 出力
この項では、TKPROFの出力について説明します。
この項では、次の項目について説明します。
23.6.2.5.1 TKPROFでのSQL文を発行するユーザーの識別
TKPROF
は、各SQL文を発行したユーザーのユーザーIDを出力します。
SQLトレース入力ファイルに複数のユーザーからの統計が含まれ、文が複数のユーザーによって発行された場合、TKPROF
は、文を解析した最後のユーザーのIDを出力します。すべてのデータベース・ユーザーのユーザーIDは、列ALL_USERS
.USER_ID
のデータ・ディクショナリに表示されます。
23.6.2.5.2 TKPROFの表形式の統計
TKPROFは、SQLトレース機能によって戻されるSQL文の統計のリストを行と列に作成します。
各行は、SQL文を処理する3つのステップの1つに対応します。統計は、次に示すCALL
列の値によって識別されます。表23-4を参照してください。
表23-4 CALL列の値
CALLの値 | 意味 |
---|---|
|
適切なセキュリティ認可のチェック、および表、列、その他の参照オブジェクトの存在のチェックを行ってSQL文を実行計画に変換します。 |
|
Oracle Databaseによる実際の文の実行です。 |
|
問合せを満たす行を取得します。フェッチは、 |
SQLトレース機能の出力におけるその他の列は、すべての文の解析、実行、フェッチについての統計です。query
とcurrent
の合計が、アクセスされたバッファの総数となります。これは論理I/O(LIO)とも呼ばれます。表23-5を参照してください。
表23-5 解析、実行およびフェッチのSQLトレース統計
SQLトレース統計 | 意味 |
---|---|
|
文が解析、実行またはフェッチされた回数です。 |
|
文に対するすべての解析コール、実行コールまたはフェッチ・コールにかかったCPU時間の合計(単位は秒)です。この値は、 |
|
文に対するすべての解析コール、実行コールまたはフェッチ・コールにかかった経過時間の合計(単位は秒)です。この値は、 |
|
すべての解析コール、実行コールまたはフェッチ・コールに対して、ディスク上のデータファイルから物理的に読み取ったデータ・ブロックの総数です。 |
|
すべての解析コール、実行コールまたはフェッチ・コールに対して、一貫モードで取り出されたバッファの総数です。通常バッファは 問合せに対して一貫モードで取り出されます。 |
|
現行モードで取り出されたバッファの総数です。 |
処理された行に関する統計は、ROWS
列に表示されます。この列は、SQL文によって処理される行数を示します。この値には、SQL文の副問合せによって処理された行は含まれません。SELECT
文の場合、戻された行数はフェッチ・ステップに表示されます。UPDATE
文、DELETE
文およびINSERT
文の場合、処理された行数は実行ステップに表示されます。
ノート:
行ソースの件数は、カーソルがクローズされたときに表示されます。SQL*Plusでは、ユーザー・カーソルは1つしかないため、文が実行されるたびに直前のカーソルがクローズされます。これにより、行ソースの件数が表示されます。PL/SQLには、独自のカーソル処理方法があり、親カーソルがクローズされても子カーソルはクローズされません。終了または再接続すると、件数が表示されます。
23.6.2.5.3 TKPROFのライブラリ・キャッシュ・ミス
TKPROFは、各SQL文の解析ステップと実行ステップの結果として生じるライブラリ・キャッシュ・ミス回数のリストも作成します。
これらの統計は、表形式の統計に続く別の行に表示されます。文でライブラリ・キャッシュ・ミスが発生しなかった場合、TKPROF
はその統計のリストを作成しません。「例」における解析ステップでは、ライブラリ・キャッシュ・ミスが1回発生し、実行ステップではライブラリ・キャッシュ・ミスは発生しませんでした。
23.6.2.5.4 TKPROFの行ソースの操作
TKPROF出力の行ソースの操作では、行に対して実行される各操作で処理される行数と、物理読取りおよび書込みなど、行ソースの追加情報が提供されます。
表23-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)
23.6.2.5.5 TKPROF内の待機イベント情報
待機イベント情報が存在する場合、TKPROF
の出力には待機イベントに関するセクションが含まれます。
出力は次のようになります。
Elapsed times include waiting on following events:
Event waited on Times Waited Max. Wait Total 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';
23.6.2.6 例
この項では、一般的なTKPROFユースケースについて説明します。
例23-4 最もリソース集中型の文の印刷
SORT
パラメータとPRINT
パラメータの組合せを使用して大規模なトレース・ファイルを処理する場合は、リソースを最も多く使用する文のみを含むTKPROF
出力ファイルを生成できます。次の文は、トレース・ファイルに格納されている、ほとんどの物理I/Oを生成した10個の文を印刷します。
TKPROF ora53269.trc ora53269.prf SORT = (PRSDSK, EXEDSK, FCHDSK) PRINT = 10
例23-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
パラメータを常に使用してください。
例23-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
***************************************************************************
例23-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
********************************************************************************
例23-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.
23.7 アプリケーションのトレースのビュー
データ・ディクショナリ・ビューおよびV$
ビューを使用して、トレースを監視できます。
この項には次のトピックが含まれます:
23.7.1 トレース統計の公開に関連するビュー
収集した統計情報は、次のV$
ビューおよびDBA
ビューで表示できます。
表23-7 診断ビュー
ビュー | 説明 |
---|---|
DBA_ENABLED_AGGREGATIONS |
現在有効な統計の累積グローバル統計 |
V$CLIENT_STATS |
指定されたクライアント識別子の累積統計 |
V$SERVICE_STATS |
指定されたサービスの累積統計 |
V$SERV_MOD_ACT_STATS |
指定されたサービス、モジュールおよびアクションの組合せの累積統計 |
V$SERVICEMETRIC |
データベース・コールの経過時間およびCPU使用率の累積統計 |
V$DIAG_TRACE_FILE |
現在のコンテナのADRにあるすべてのトレース・ファイルに関する情報 |
V$DIAG_APP_TRACE_FILE |
現在のコンテナのADRにあるアプリケーション・トレース・データ(SQL_TRACE またはOPTIMIZER_TRACE イベント・データ)を含むすべてのトレース・ファイルに関する情報
|
V$DIAG_TRACE_FILE_CONTENTS |
ADRにあるトレース・ファイル内のトレース・データ |
V$DIAG_SQL_TRACE_RECORDS |
ADRにあるトレース・ファイル内のSQL_TRACE データ
|
V$DIAG_OPT_TRACE_RECORDS |
ADRにあるトレース・ファイル内のオプティマイザ・トレース・イベント・データ |
V$DIAG_SESS_SQL_TRACE_RECORDS |
現在のユーザー・セッションのADRにあるトレース・ファイル内のSQL_TRACE データ
|
V$DIAG_SESS_OPT_TRACE_RECORDS |
現在のユーザー・セッションのADRにあるトレース・ファイル内のオプティマイザ・トレース・イベント・データ |
V$DIAG_ALERT_EXT |
現在のコンテナのADRにあるXMLベース・アラート・ログの内容 |
関連項目:
V$
ビューおよびデータ・ディクショナリ・ビューの詳細は、Oracle Databaseリファレンスを参照してください