日本語PDF

22 SQLテスト・ケース・ビルダーを使用した診断データの収集

SQLテスト・ケース・ビルダーは、異なるデータベース・インスタンス内の問題の再現に必要な情報を自動的に収集するツールです。

SQLテスト・ケースは、パフォーマンスの問題が発生した特定のSQL文の実行計画を開発者が再現できるようにするための一連の情報です。

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

22.1 SQLテスト・ケース・ビルダーの目的

SQLテスト・ケース・ビルダーによって、問題に関する情報とその問題が発生した環境に関する情報を収集し再現するプロセスが自動化されます。

ほとんどのSQLコンポーネントでは、再現可能なテスト・ケースを取得することが、迅速に不具合を解決するための最も重要な要因となります。ユーザーにとって最も長く手間のかかるステップでもあります。SQLテスト・ケース・ビルダーの目的は、SQLインシデントに関連する情報をできるだけ多く収集し、Oracleスタッフが別のシステムで問題を再現できるようにパッケージ化することです。

SQLテスト・ケース・ビルダーの出力は、事前に定義されたディレクトリに集められたスクリプトです。これらのスクリプトには、別のデータベース・インスタンスでの必要なすべてのオブジェクトと環境の再作成に必要なコマンドが含まれています。テスト・ケースの準備が整ったら、そのディレクトリのZIPファイルを作成して別のデータベースに移動するか、またはそのファイルをOracleサポートにアップロードできます。

22.2 SQLテスト・ケース・ビルダーの概念

SQLテスト・ケース・ビルダーの主な概念には、SQLインシデント、記録される情報のタイプおよび出力の形式が含まれます。

この項では、次の項目について説明します。

22.2.1 SQLインシデント

Oracle Databaseの障害診断インフラストラクチャでは、インシデントは1つの問題の1回の発生を表します。

SQLインシデントはSQL関連の問題です。問題(クリティカル・エラー)が複数回発生したとき、それぞれの発生に対してインシデントが作成されます。インシデントには日時が記録され、自動診断リポジトリ(ADR)で追跡されます。各インシデントには、ADR内で一意である数値のインシデントIDがあります。

SQLテスト・ケース・ビルダーには、コマンドラインで常時アクセスできます。Oracle Enterprise Manager Cloud Control(Cloud Control)では、SQLテスト・ケース・ページは、SQLインシデントが見つかった場合にのみ利用できます。

22.2.2 SQLテスト・ケース・ビルダーで取得される情報

SQLテスト・ケース・ビルダーは、SQL問合せおよびその環境に関する永続的な情報を取得します。

この情報には、実行中の問合せ、表と索引の定義(実際のデータではありません)、PL/SQLパッケージおよびプログラム・ユニット、オプティマイザ統計、SQL計画ベースライン、初期化パラメータの設定などがあります。Oracle Database 12c以降では、文の実行の一部としてのみ使用できる情報など、一時情報の取得や再現もSQLテスト・ケース・ビルダーで行われるようになりました。

SQLテスト・ケース・ビルダーでは、次のものがサポートされています。

  • 適応計画

    SQLテスト・ケース・ビルダーは、適応計画に関して行われた決定への入力を取得し、各決定の時点でそれらを再現します。適応計画の場合、最終プランの決定には、各バッファ統計コレクタの最終統計値で十分です。

  • 自動メモリー管理

    データベースは、各SQL操作で要求されたメモリーを自動的に処理します。ソートなどのアクションは、パフォーマンスに重大な影響を及ぼす可能性があります。SQLテスト・ケース・ビルダーでは、データベースで割り当てられたメモリーの場所とその割当て量などのメモリー・アクティビティが記録されています。

  • 動的統計

    動的統計とは、述語の選択性を見積もるために、データベースが再帰的SQL文を実行して表のブロックの小さいランダム・サンプルをスキャンする最適化手法です。異なるデータベース上の動的統計の再収集では、必ずしも同じ結果(データの消失時間など)が生成されるわけではありません。問題を再現するには、SQLテスト・ケース・ビルダーでソース・データベースから動的統計の結果をエクスポートします。テスト・データベースでは、SQLテスト・ケース・ビルダーによって、動的統計を再収集するのではなくソース・データベースから取得した同じ値を再利用します。

  • 複数の実行のサポート

    SQLテスト・ケース・ビルダーでは、問合せの複数の実行の間に累積された動的情報を取得できます。この機能は自動再最適化において重要です。

  • コンパイル環境およびバインド値の再現

    コンパイル環境設定は、問合せ最適化コンテキストの重要な一部です。ソース・データベースで問題の問合せが実行された際には、ユーザーが変更したデフォルトではない設定がSQLテスト・ケース・ビルダーで取得されます。デフォルトではないパラメータ値が使用されている場合、SQLテスト・ケース・ビルダーは、問合せを実行する前に、その同じ値を再構築します。

  • オブジェクトの統計履歴

    オブジェクトの統計履歴は、統計値の変更によって計画に変更が生じたかどうかを確認する場合に役に立ちます。DBMS_STATSは、履歴をデータ・ディクショナリ内に格納します。SQLテスト・ケース・ビルダーは、エクスポートの間にこの統計データをステージング表に格納します。インポートの間には、SQLテスト・ケース・ビルダーによって、統計履歴のデータがステージング表からターゲット・データベースに自動的にリロードされます。

  • 文の履歴

    文の履歴は、適応カーソル共有、静的フィードバックおよびカーソル共有の不具合に関する問題の診断の際に重要です。この履歴には、実行計画とコンパイル統計および実行統計が含まれます。

関連項目:

22.2.3 SQLテスト・ケース・ビルダーの出力

SQLテスト・ケース・ビルダーの出力は、環境と必要なすべてのオブジェクトの再作成に必要なコマンドが格納された一連のファイルです。

SQLテスト・ケース・ビルダーでは、デフォルトで次のディレクトリにファイルが格納されます。ここでのincnumはインシデント番号を指し、runnumは実行番号を指します。

$ADR_HOME/incident/incdir_incnum/SQLTCB_runnum

たとえば、有効な出力ファイル名は次のようになります。

$ORACLE_HOME/log/diag/rdbms/dbsa/dbsa/incident/incdir_2657/SQLTCB_1

次の例に示すように、SQL_TCB_DIRという名前のディレクトリ・オブジェクトを作成し、プロシージャDBMS_SQLDIAG.EXPORT_SQL_TESTCASEを実行することで、SQLテスト・ケース・ビルダー・ファイルの格納先となる特定のディレクトリを指定することもできます。

CREATE OR REPLACE DIRECTORY SQL_TCB_DIR '/tmp';

DECLARE  
tc CLOB;
BEGIN 
  DBMS_SQLDIAG.EXPORT_SQL_TESTCASE (
    directory => 'SQL_TCB_DIR',   
    sql_text  => 'select * from hr_table',   
    testcase  => tc);
END;

ノート:

データベース管理者は、ディレクトリ・オブジェクトSQL_TCB_DIRで指定されたオペレーティング・システム・ディレクトリに対する読取りおよび書込みアクセス権限を持っている必要があります。

DBMS_SQLDIAG.EXPORT_SQL_TESTCASEプロシージャのtestcase_nameパラメータを使用してテスト・ケースの名前を指定することもできます。テスト・ケース名は、SQLテスト・ケース・ビルダーによって生成されるすべてのファイルの接頭辞として使用されます。

テスト・ケース名を指定しない場合、SQLテスト・ケース・ビルダーによって、次の形式のデフォルト・テスト・ケース名が使用されます。

oratcb_connectionId_sqlId_sequenceNumber_sessionId

ここで、connectionIdはデータベース接続ID、sqlIdはSQL文ID、sequenceNumberは内部順序番号、sessionIdはデータベース・セッションIDです。

DBMS_SQLDIAG.EXPORT_SQL_TESTCASEプロシージャのctrlOptionsパラメータを使用してSQLテスト・ケース・ビルダーの出力に含める追加情報を指定することもできます。ctrlOptionsパラメータに指定できるオプションの一部を次に示します。

  • compress: このオプションは、SQLテスト・ケース・ビルダーの出力ファイルをzipファイルに圧縮する場合に使用します。

  • diag_event: このオプションは、SQLテスト・ケース・ビルダーの出力に含めるトレース情報のレベルを指定するために使用します。

  • problem_type: このオプションは、SQLテスト・ケース・ビルダーのテスト・ケースの問題タイプを割り当てるために使用します。たとえば、テスト・ケースがパフォーマンス回帰の問題に関連している場合は、problem_typeオプションにPERFORMANCEの値を割り当てることができます。

次の例に示すように、V$SQL_TESTCASESビューを問い合せることで、SQLテスト・ケース・ビルダーによって生成されたすべてのテスト・ケースに関する情報を表示できます。


select testcase_name, sql_text from v$sql_testcases;

TESTCASE_NAME                           SQL_TEXT
-------------------------------------   ----------------------
oratcb_0_am8q8kudm02v9_1_00244CC50001   select * from hr_table

ノート:

V$SQL_TESTCASESビューには、SQL_TCB_DIRという名前のSQLテスト・ケース・ビルダーのルート・ディレクトリ・オブジェクトが存在する必要があります。Oracle Autonomous Database環境では、プロビジョニング中にこのディレクトリ・オブジェクトが各PODに自動的に作成されます。オンプレミス・データベースの場合は、SQLテスト・ケース・ビルダーのルート・ディレクトリ・オブジェクトSQL_TCB_DIRを明示的に作成する必要があり、作成しないとV$SQL_TESTCASESビューに情報が表示されません。データベース管理者は、ディレクトリ・オブジェクトSQL_TCB_DIRで指定されたオペレーティング・システム・ディレクトリに対する読取りおよび書込みアクセス権限を持っている必要があります。

関連項目:

22.3 SQLテスト・ケース・ビルダーのユーザー・インタフェース

SQLテスト・ケース・ビルダーにアクセスするには、Cloud Controlを使用するか、コマンドラインでPL/SQLを使用します。

この項では、次の項目について説明します。

22.3.1 SQLテスト・ケース・ビルダーのグラフィカル・インタフェース

Cloud Control内では、インシデント・マネージャ・ページまたはサポート・ワークベンチ・ページからSQLテスト・ケース・ビルダーにアクセスできます。

この項では、次の項目について説明します。

22.3.1.1 インシデント・マネージャへのアクセス

データベース・ホーム・ページの「インシデントと問題」セクションから、インシデント・マネージャに移動できます。

インシデント・マネージャにアクセスするには:

  1. 適切な資格証明を使用してCloud Controlにログインします。

  2. 「ターゲット」メニューの下で、「データベース」を選択します。

  3. データベース・ターゲットのリストで、管理対象のOracle Databaseインスタンスのターゲットを選択します。

  4. データベースの資格証明の入力を求められた場合は、実行するタスクに必要な最小限の資格証明を入力します。

  5. インシデントと問題セクションで、調査するSQLインシデントを特定します。

    次の例のように、ORA 600エラーはSQLインシデントです。

  6. インシデントの概要をクリックします。

    「インシデント・マネージャ」の「問題の詳細」ページが表示されます。

    表にリストされたインシデントを含む「サポート・ワークベンチ」ページが表示されます。

22.3.1.2 サポート・ワークベンチへのアクセス

「Oracleデータベース」メニューから、サポート・ワークベンチに移動できます。

サポート・ワークベンチにアクセスするには:

  1. 適切な資格証明を使用してCloud Controlにログインします。

  2. 「ターゲット」メニューの下で、「データベース」を選択します。

  3. データベース・ターゲットのリストで、管理対象のOracle Databaseインスタンスのターゲットを選択します。

  4. データベースの資格証明の入力を求められた場合は、実行するタスクに必要な最小限の資格証明を入力します。

  5. 「Oracle Database」メニューから、「診断」「サポート・ワークベンチ」を選択します。

    表にリストされたインシデントを含む「サポート・ワークベンチ」ページが表示されます。

22.3.2 SQLテスト・ケース・ビルダーのコマンドライン・インタフェース

DBMS_SQLDIAGパッケージは、SQLテスト・ケース・ビルダーに関連するタスクを実行します。

このパッケージは、SQLテスト・ケース・ビルダー用の様々なサブプログラムで構成されます。次の表にその一部を示します。

表22-1 DBMS_SQLDIAGパッケージ内のSQLテスト・ケース・ファンクション

プロシージャ 説明

EXPORT_SQL_TESTCASE

SQLテスト・ケースをユーザー指定のディレクトリにエクスポートします。

EXPORT_SQL_TESTCASE_DIR_BY_INC

引数として渡されたインシデントIDに対応するSQLテスト・ケースをエクスポートします。

EXPORT_SQL_TESTCASE_DIR_BY_TXT

引数として渡されたSQLテキストに対応するSQLテスト・ケースをエクスポートします。

IMPORT_SQL_TESTCASE

SQLテスト・ケースをスキーマにインポートします。

REPLAY_SQL_TESTCASE

SQLテスト・ケースの再現を自動化します。

EXPLAIN_SQL_TESTCASE

SQLテスト・ケースについて記述します。

関連項目:

DBMS_SQLDIAGパッケージについてさらに学習するには、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください

22.4 SQLテスト・ケース・ビルダーの実行

Cloud Controlを使用してSQLテスト・ケース・ビルダーを実行できます。

前提条件

このチュートリアルでは、次のことが前提となっています。

  • 内部エラーが発生する次のEXPLAIN PLAN文をユーザーshとして実行します。

    EXPLAIN PLAN FOR
      SELECT unit_cost, sold
      FROM   costs c,
             ( SELECT /*+ merge */ p.prod_id, SUM(quantity_sold) AS sold
               FROM   products p, sales s
               WHERE  p.prod_id = s.prod_id
               GROUP BY p.prod_id ) v
      WHERE  c.prod_id = v.prod_id;
    
  • データベース・ホーム・ページのインシデントと問題セクションに、内部エラーによって生成されるSQLインシデントが表示されます。

  • 「インシデント・マネージャへのアクセス」の説明に従って、「インシデントの詳細」ページにアクセスします。

SQLテスト・ケース・ビルダーを実行するには:

  1. 「インシデント」タブをクリックします。

    問題の詳細ページが表示されます。

  2. インシデントの概要をクリックします。

    インシデントの詳細ページが表示されます。

  3. 「ガイドされた解決」で、「診断データの表示」をクリックします。

    「インシデントの詳細: incident_number」ページが表示されます。

  4. 「アプリケーション情報」セクションで、「追加の診断」をクリックします。

    「追加の診断」サブページが表示されます。

  5. 「SQLテスト・ケース・ビルダー」を選択して、「実行」をクリックします。

    「ユーザー処理を実行」ページが表示されます。

  6. サンプリング割合を選択し(オプション)、「送信」をクリックします。

    処理が完了すると、「確認」ページが表示されます。

  7. 「SQLテスト・ケース・ビルダーの出力」に説明されている場所にあるSQLテスト・ケース・ファイルにアクセスします。