ストアド・プロシージャ内でクエリ・プランを取得する
この文書では、SQL Anywhere Studio 9.0.0 以降でインデックス・コンサルタントの負荷取得機能を使用し、クエリ実行プランを取得する方法を説明します。
ストアド・プロシージャで実行される SQL 文のクエリ・プランを取得することが必要な場合があります。特に、パフォーマンスの問題で分析が必要な場合です。プロシージャ内の該当する文が分かっていたとしても、他のコンテキストで (通常 Interactive SQL から)、最適ではないプランを再現することは容易ではありません。なぜなら、プラン選択はクエリで参照される変数に指定した値、その時点でのデータベース・キャッシュの量、プロシージャに影響するオプション設定などに依存しているためです。
SQL クエリで使用される実行プランを取得する簡単な方法として、Adaptive Server Anywhere (SQL Anywhere)インデックス・コンサルタントの負荷取得機能を利用します。インデックス・コンサルタントはSQL Anywhere Studio 9.0.0 以降で使用可能です。
インデックス・コンサルタントを使用して、SQL クエリの負荷を取得するには:
1. Sybase Central からデータベースへ接続します。
2. Sybase Central の左ウィンドウ枠で [インデックス] フォルダを選択します。ツール・バーから [ファイル] - [インデックス・コンサルタント] を選択し、インデックス・コンサルタントを起動させます。
3. データベースの負荷取得が有効になるまでインデックス・コンサルタントのダイアログを進めます。この負荷をデータベースに保存するために名前を付けます。
4. アプリケーションまたは SQL 文を実行し、ストアド・プロシージャを呼び出します。
5. インデックス・コンサルタントで [完了] をクリックし、Sybase Central で負荷取得を停止します。
6. インデックス・コンサルタントの分析フェーズをキャンセルします。必要ならば、後から保存した負荷を分析することができます。
7. システム・テーブル DBO.IX_CONSULTANT_CAPTURE の内容を分析します。このテーブルには、負荷取得が有効な間にこのデータベースに対してサーバが実行したすべての SELECT 、INSERT 、UPDATE 、DELETE 文ごとのローが含まれます。WORKLOAD_NAME カラムは負荷の名前、QUERY_TEXT カラムは文のテキスト、PLAN_TEXT カラムはクエリのアクセス・プランの短いテキスト形式のフォーム(EXPLANATION() 関数で返されるものと同等) を含みます。
短いプランはグラフィカルなプランのように詳細が盛り込まれていないので、状況を識別しやすくなります。たとえば、逐次スキャンが特定のインデックスの代わりにオプティマイザに採用された、などです。この情報とより詳細なグラフィカルなプランを使用し、Interactive SQL で文の問題を後から再作成することができます。または、インデックス・コンサルタントを使用して、この保存された負荷を分析します。インデックス・コンサルタントが該当する文のパフォーマンスを向上させるスキーマ変更を推奨した場合、それを判断します。