SQLテスト・ケースは、パフォーマンスの問題が発生した特定のSQL文の実行計画を開発者が再現できるようにするための一連の情報です。SQLテスト・ケース・ビルダーは、異なるデータベース・インスタンス内の問題の再現に必要な情報を自動的に収集するツールです。
この章の内容は次のとおりです。
SQLテスト・ケース・ビルダーでは、問題とそれが発生した環境に関する情報を収集および再現する、時に困難で時間がかかるプロセスを自動化します。
SQLテスト・ケース・ビルダーの出力は、事前に定義されたディレクトリに集められたスクリプトです。これらのスクリプトには、必要なすべてのオブジェクトと環境の再作成に必要なコマンドが含まれています。テスト・ケースの準備が整ったら、そのディレクトリのZIPファイルを作成して別のデータベースに移動するか、またはそのファイルをOracleサポートにアップロードできます。
この項の内容は次のとおりです。
Oracle Databaseの障害診断インフラストラクチャでは、インシデントは1つの問題の1回の発生を表します。SQLインシデントはSQL関連の問題です。問題(クリティカル・エラー)が複数回発生したとき、それぞれの発生に対してインシデントが作成されます。インシデントには日時が記録され、自動診断リポジトリ(ADR)で追跡されます。各インシデントは、ADR内で一意の数値であるインシデントIDによって識別されます。
SQLテスト・ケース・ビルダーには、コマンドラインで常時アクセスできます。Oracle Enterprise Manager Cloud Control(Cloud Control)では、SQLテスト・ケース・ページは、SQLインシデントが見つかった場合にのみ利用できます。
関連項目:
ADRの概要は、『Oracle Database概要』を参照してください。
問題の調査方法、レポート作成方法および解決方法の詳細は、『Oracle Database管理者ガイド』を参照してください。
SQLテスト・ケース・ビルダーで取得される永続的な情報には、実行済の問合せ、表および索引の定義(実際のデータは対象外)、PL/SQLパッケージおよびプログラム・ユニット、オプティマイザの統計、SQL計画ベースライン、初期化パラメータの設定などがあります。Oracle Database 12cから、文の実行の一部としてのみ使用できる情報など、一時情報の取得や再現もSQLテスト・ケース・ビルダーで行われるようになりました。
SQLテスト・ケース・ビルダーでは、次のものがサポートされています。
適応計画
SQLテスト・ケース・ビルダーでは、適応計画に関して行われた決定への入力が取得され、各決定の時点でそれらを再現します(「適応計画」を参照)。適応計画の場合、最終プランの決定には、各バッファ統計コレクタの最終統計値で十分です。
自動メモリー管理
データベースは、各SQL操作で要求されたメモリーを自動的に処理します。ソートなどのアクションは、パフォーマンスに重大な影響を及ぼす可能性があります。SQLテスト・ケース・ビルダーでは、データベースで割り当てられたメモリーの場所とその割当て量などのメモリー・アクティビティが記録されています。
動的統計
異なるデータベース上の動的統計の再収集では、データの消失時間など、常に同じ結果が生成されるわけではありません(「動的統計」を参照)。問題を再現するには、SQLテスト・ケース・ビルダーでソース・データベースから動的統計の結果をエクスポートします。テスト・データベースでは、SQLテスト・ケース・ビルダーによって、動的統計を再収集するのではなくソース・データベースから取得した同じ値を再利用します。
複数の実行のサポート
SQLテスト・ケース・ビルダーでは、問合せの複数の実行の間に累積された動的情報を取得できます。この機能は、自動再最適化の際に重要です(「自動再最適化」を参照)。
コンパイル環境およびバインド値の再現
コンパイル環境設定は、問合せ最適化コンテキストの重要な一部です。ソース・データベースで問題の問合せが実行された際には、ユーザーが変更したデフォルトではない設定がSQLテスト・ケース・ビルダーで取得されます。デフォルトではないパラメータ値が使用されている場合、SQLテスト・ケース・ビルダーは、問合せを実行する前に、その同じ値を再構築します。
オブジェクトの統計履歴
オブジェクトの統計履歴は、統計値の変更によって計画に変更が生じたかどうかを確認する場合に役に立ちます。DBMS_STATS
は、履歴をデータ・ディクショナリ内に格納します。SQLテスト・ケース・ビルダーは、エクスポートの間にこの統計データをステージング表に格納します。インポートの間には、SQLテスト・ケース・ビルダーによって、統計履歴のデータがステージング表からターゲット・データベースに自動的にリロードされます。
文の履歴
文の履歴は、適応カーソル共有、静的フィードバックおよびカーソル共有の不具合に関する問題の診断の際に重要です。この履歴には、実行計画とコンパイル統計および実行統計が含まれます。
関連項目:
DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
SQLテスト・ケース・ビルダーの出力には、必要なすべてのオブジェクトおよび環境の再作成に必要なコマンドを含むファイルがまとめられています。デフォルトでは、SQLテスト・ケース・ビルダーで次の場所にファイルを格納します。ここでのincnumはインシデント番号を指し、runnumは実行番号を指します。
$ADR_HOME/incident/incdir_incnum/SQLTCB_runnum
たとえば、有効な出力ファイル名は次のようになります。
$ORACLE_HOME/log/diag/rdbms/dbsa/dbsa/incident/incdir_2657/SQLTCB_1
デフォルトではない場所を指定するには、次の例のように、Oracleディレクトリを作成してDBMS_SQLDIAG.EXPORT_SQL_TESTCASE
を呼び出します。
CREATE OR REPLACE DIRECTORY my_tcb_dir_exp '/tmp'; BEGIN DBMS_SQLDIAG.EXPORT_SQL_TESTCASE ( directory => 'my_tcb_dir_exp' , sql_text => 'SELECT COUNT(*) FROM sales' , testcase => tco ); END;
関連項目:
ADRリポジトリの構造の詳細は、『Oracle Database管理者ガイド』を参照してください。
SQLテスト・ケース・ビルダーにアクセスするには、Cloud Controlを使用するか、コマンドラインでPL/SQLを使用します。
Cloud Control内では、インシデント・マネージャ・ページまたはサポート・ワークベンチ・ページからSQLテスト・ケース・ビルダーにアクセスできます。
このタスクでは、データベース・ホーム・ページのインシデントと問題セクションからインシデント・マネージャに移動する方法を説明します。
インシデント・マネージャにアクセスする手順は次のとおりです。
適切な資格証明を使用してCloud Controlにログインします。
「ターゲット」メニューの下で、「データベース」を選択します。
データベース・ターゲットのリストで、管理対象のOracle Databaseインスタンスのターゲットを選択します。
データベースの資格証明の入力を求められた場合は、実行するタスクに必要な最小限の資格証明を入力します。
インシデントと問題セクションで、調査するSQLインシデントを特定します。
次の例のように、ORA 600
エラーはSQLインシデントです。
インシデントの概要をクリックします。
「インシデント・マネージャ」の「問題の詳細」ページが表示されます。
表にリストされたインシデントを含む「サポート・ワークベンチ」ページが表示されます。
関連項目:
Cloud Controlのサポート・ワークベンチを使用して問題を表示する方法の詳細は、『Oracle Database管理者ガイド』を参照してください。
Cloud Controlのオンライン・ヘルプを参照してください。
このタスクでは、Oracle Databaseメニューからインシデント・マネージャに移動する方法を説明します。
サポート・ワークベンチにアクセスする手順は次のとおりです。
適切な資格証明を使用してCloud Controlにログインします。
「ターゲット」メニューの下で、「データベース」を選択します。
データベース・ターゲットのリストで、管理対象のOracle Databaseインスタンスのターゲットを選択します。
データベースの資格証明の入力を求められた場合は、実行するタスクに必要な最小限の資格証明を入力します。
「Oracle Database」メニューから、「診断」→「サポート・ワークベンチ」を選択します。
表にリストされたインシデントを含む「サポート・ワークベンチ」ページが表示されます。
関連項目:
Cloud Controlのオンライン・ヘルプを参照してください。
DBMS_SQLDIAG
パッケージは、SQLテスト・ケース・ビルダーに関連するタスクを実行します。
このパッケージは、SQLテスト・ケース・ビルダー用の様々なサブプログラムで構成されます。表17-1に、そのサブプログラムの一部を示します。
表17-1 DBMS_SQLDIAGのSQLテスト・ケース・ファンクション
プロシージャ | 説明 |
---|---|
|
SQLテスト・ケースをユーザー指定のディレクトリにエクスポートします。 |
|
引数として渡されたインシデントIDに対応するSQLテスト・ケースをエクスポートします。 |
|
引数として渡されたSQLテキストに対応するSQLテスト・ケースをエクスポートします。 |
|
SQLテスト・ケースをスキーマにインポートします。 |
関連項目:
DBMS_SQLDIAG
パッケージの詳細は、Oracle Database PL/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テスト・ケース・ビルダーを実行する手順は次のとおりです。
「インシデント」タブをクリックします。
問題の詳細ページが表示されます。
インシデントの概要をクリックします。
インシデントの詳細ページが表示されます。
「ガイドされた解決」で、「診断データの表示」をクリックします。
「インシデントの詳細: incident_number」ページが表示されます。
「アプリケーション情報」セクションで、「追加の診断」をクリックします。
「追加の診断」サブページが表示されます。
「SQLテスト・ケース・ビルダー」を選択して、「実行」をクリックします。
「ユーザー処理を実行」ページが表示されます。
サンプリング割合を選択し(オプション)、「送信」をクリックします。
処理が完了すると、「確認」ページが表示されます。
「SQLテスト・ケース・ビルダーの出力」に説明されている場所にあるSQLテスト・ケース・ファイルにアクセスします。
関連項目:
Cloud Controlのオンライン・ヘルプを参照してください。