Query Plan Viewer
クエリの最適化に役立つユーティリティ
おそらく、SQL パフォーマンスの最も複雑な面は、クエリの最適化です。データベース エンジンはクエリの最適化を自動的に実行しますが、クエリ構造自体が全体的な性能やエンジンによる最適化方法に影響する可能性があります。
ほとんどすべてのクエリは、2 とおり以上の書き方をしても、同じ結果セットを返すことができます。たとえば、単純な SELECT * FROM table1 というクエリについて考えてみましょう。table1 には 5 つの列があり、col1、col2、(以下同様)という名前が付けられているとします。クエリを SELECT col1, col2, col3, col4, col5 FROM table1 と記述しても、同様の結果セットをもたらすことができます。
これら 2 つのクエリを視覚的に比較した場合、SELECT * の方が、各列を名前で列挙するよりも単純なように見えます。しかし、クエリ内に各列を名前で列挙することによって、ごくわずかながらパフォーマンスが引き上げられます。これは、SELECT * の場合には、アスタリスク記号を列名に解析しなければならないからです。クエリ自体でそのような解析を前もって実行しておけば、その作業は必要でなくなります。
パフォーマンスを向上させる最良の方法は、データベースに対してクエリを実行するのに必要な時間を最小限にすることです。クエリは非常に複雑にすることも、途方もなく大きい構造にすることもできるため、考え得るすべてのクエリの最適化について、この付録で説明することはできません。しかし、Query Plan Viewer を使用することによって、クエリの最適化方法をよりよく判断できるようになります。
Query Plan Viewer は、データベース エンジンによって選択されたクエリ プランを表示することができるグラフィカル ユーザー インターフェイスです。クエリ プランでは SELECT、INSERT、UPDATE または DELETE ステートメントについて表示できます。Query Plan Viewer はワイド文字データとの互換性があります。
Query Plan の設定
2 つの SQL ステートメントによって、クエリ プランを作成するかどうか、また、プランにどのような名前を付けるかを制御できます。どちらのステートメントも SQL セッションにのみ適用されます。
ステートメントは、PSQL Control Center 内で、または、PSQL データベース エンジンに SQL ステートメントを送信できるユーティリティから実行できます。
クエリ プラン ファイルの場所と名前を設定します。NULL は、クエリ プラン ファイルを作成しないように指示します。1 つのクエリ プラン ファイルに複数のクエリのプラン結果を入れることができます。参考までに、クエリ プラン ファイルには、クエリごとに使用するエンコードのコード ページ識別子が含まれています。クエリでどのデータベース エンコードが使用されているかに関係なく、Query Plan Viewer はワイド文字データを正しく表示します。
SET QRYPLANOUTPUT='d:\mydirectory\select_salary.qpf'
クエリ プランの検査およびクエリ パフォーマンスの評価も参照してください。
グラフィカル ユーザー インターフェイス
Query Plan Viewer には、Query ViewerPlan Viewer の 2 つのウィンドウが含まれています。
Query Viewer
Query Viewer では SQL クエリを表示します。一度に表示できるクエリ プランは 1 つだけですが、複数のプランを同時に開いておくことができます。また Query Viewer には、クエリ プラン ファイルを開く、2 つ以上のプランを同時に開いているときに目的のクエリ プランへ移動する、およびクエリ プランをエクスポートするためのメニュー コマンドが含まれています。
Query Viewer は必要に応じて表示サイズを変更することができます。SQL クエリの表示を容易にする垂直スクロールバーも備えています。
Query Viewer ウィンドウは、ワイド文字データに適したフォントを使用します。Query Plan Viewer は、使用可能なシステム フォントをチェックし、次のうちから使用可能な最初の 1 つを選択します。
Plan Viewer
Plan Viewer には、クエリ プランのグラフィック表現がノードを持つツリー形式で含まれます。各ノードはクエリのさまざまなコンポーネントを表します。
Plan Viewer は必要に応じて表示サイズを変更することができます。さまざまなサイズでクエリ プラン ツリーを表示できるよう、垂直および水平スクロールバーを備えています。必要に応じてツリーのサイズを変更したり、ツリーを拡大/縮小したりするためのメニュー コマンドやキーボード ショートカットがあります。
クエリに応じて、異なる種類のノードが Query Viewer に現れます。各ノードは、クエリの実行のステップを表します。たとえば、ベース テーブルから選択する、2 つのテーブルの結果を結合して 1 つの結果セットに入れる、集計値を計算する、グループの変わり目を判断する、グループ結果を組み合わせて 1 つの結果セットに入れるなどを表すことができます。
ノード
次の表にノードをまとめて示します。
メモ: Plan Viewer のサイズの縦横比を変更すると、それに応じてノードを表す記号の縦横比も変わります。そのため、ノードの表示は上記の表の例と同じように見えるとは限りません。
ノードの詳細
以下のクエリ プラン ノードをダブルクリックすると、ポップアップ ウィンドウが現れ、詳細な情報が表示されます。
上記以外のノードをダブルクリックしても、ノードに関する詳しい情報は提供されません。詳細情報を持つノード上にマウス カーソルが置かれると、カーソルが手の形に変わります。
次の表では、表示される詳細情報の種類について説明します。
Plan Viewer にも、プランをさまざまなズーム レベルで表示したり、サブクエリがある場合にはそれを表示したりするためのメニュー コマンドが含まれています。
Query Plan Viewer のタスク
ここでは、以下の作業について説明します。
1
SET QRYPLAN = on を実行して、クエリ プランの作成を有効にします。
2
Query Plan の設定を参照してください。
3
4
SET QRYPLAN = off を実行して、クエリ プランの作成を無効にします。
1
PSQL Control Center で、[ツール]>[Query Plan Viewer]をクリックします。
PSQL\Bin ディレクトリにある w3sqlqpv.exe ファイルを実行します。
1
Query Viewer で、[ファイル]>[開く]メニューをクリックします。
2
Query Viewer のタイトル バーには、開いているクエリ プランの数と現在表示されているプランの情報が示されます。
3
2 つ以上のクエリ プランが開いている場合は、[表示]メニューから以下のコマンドを使用してウィンドウ間を移動できます。
先頭](または Ctrl + F):最初に読み込んだクエリ プランを表示します。
末尾](または Ctrl + L):最後に読み込んだクエリ プランを表示します。
次](または Ctrl + N):次に新しいクエリ プランを表示します。
前](または Ctrl + P):次に古いクエリ プランを表示します。
ジャンプ](または Ctrl + G):読み込んだプランの序数を基に、クエリ プランを表示します。
1
Query Viewer で、[ファイル]>[XML へエクスポート]をクリックします。
2
メモ: 同じダイアログ ボックスで、新しい XML ファイルの名前を指定することもできます。
ヒント: XML へエクスポート]メニュー項目が有効になるのは、クエリ プランがビューアに読み込まれている場合のみです。
次の表では、SQL クエリから派生した XML ファイルのスキーマについて説明します。
 
表示]をクリックしてから、変更したいサイズ変更コマンドをクリックします。
自動調整]:クエリ プランのサイズを変更して、Plan Viewer でプラン全体が表示できるようにします。ウィンドウのサイズを変更するとビューのサイズも変更されます。クエリ プランを表示するときのデフォルトは[自動調整]です。
100%]、[50%]、または[25%]:クエリ プランのサイズを指定したパーセンテージに変更します。
拡大率]:クエリ プランのサイズを、指定したパーセンテージに変更します。
拡大(-)]または[縮小(+)]:クエリ プランのサイズを大きくする(拡大)か、または、小さく(縮小)します。拡大率は 5% から 500% の間で指定できます。
表示]をクリックしてから、希望するスクロール コマンドをクリックします。
右へスクロール](または右矢印):ウィンドウの右側へ向かってスクロールします。
左へスクロール](または左矢印):ウィンドウの左側へ向かってスクロールします。
上へスクロール](または上矢印):ウィンドウの上側へ向かってスクロールします。
下へスクロール](または下矢印):ウィンドウの下側へ向かってスクロールします。
Query Viewer で、[ファイル]>[更新]をクリックします。
これは、現在読み込まれているクエリ プラン ファイルの再読み取りを行います。
Plan Viewer で、次のノードのいずれかをダブルクリックします。
ノードの詳細を参照してください。
Plan Viewer で、[サブクエリ]をクリックしてからサブクエリの番号をクリックします(メイン クエリ内の最初のサブクエリは「サブクエリ 1」に対応し、2 番目のクエリは「サブクエリ 2」、以下同様に対応します)。クエリ プランには、いくつものサブクエリが含まれることもあれば、サブクエリなしの場合もあります。クエリ プランに対するすべてのサブクエリが[サブクエリ]メニューに現れます。サブクエリを選択すると、その名前が Plan Viewer のタイトル バーのかっこ内に表示されます。
クエリ プランの検査およびクエリ パフォーマンスの評価
Query Plan Viewer は特に、作成したクエリをテストして、そのクエリをデータベース エンジンがどのように実行するかを調べる、プロジェクトの開発段階で役に立ちます。それぞれのクエリを作成し、クエリ プラン ファイルを 1 つ生成してから、各プランを検査することができます。各クエリの情報を基に、インデックスを追加したり削除したりして、その変更による影響を調べることができます。また、クエリを変更して、ステートメントの構文に加えた変更がパフォーマンスに影響を及ぼすかどうかを調べることもできます。
比較するクエリ プランの例を作成する
例として、以下の手順に従って、PSQL で提供されるサンプル データベース Demodata のいくつかのテーブルを使用することにより、Query Plan Viewer の使い方を実演できます。
比較のために、Enrolls テーブルからインデックスを 1 つ削除し、クエリを実行してクエリ プラン ファイルを作成した後、Enrolls にインデックスを追加し直し、クエリをもう一度実行して比較クエリ プラン ファイルを作成します。
1
2
DROP INDEX Enrolls.ClassID
Demodata はインストールするときに最適化されるため、Enrolls テーブルの Class_ID 列からインデックスを削除する必要があります。
3
SELECT Student.ID, Class.Name, Course.Credit_Hours FROM Student, Enrolls, Class, Course WHERE Student.ID = Enrolls.Student_Id AND Enrolls.Class_ID = Class.ID AND Class.Name = Course.Name
このクエリは、在籍するすべての学生と、学生が登録している講座、および各コースの履修単位時間を取得します。
4
PCC で、クエリ プラン ファイルの名前を example2.qpf と指定します。Query Plan の設定を参照してください。
5
CREATE INDEX ClassID ON Enrolls(Class_ID)
6
SELECT Student.ID, Class.Name, Course.Credit_Hours FROM Student, Enrolls, Class, Course WHERE Student.ID = Enrolls.Student_Id AND Enrolls.Class_ID = Class.ID AND Class.Name = Course.Name
クエリの実行が速くなったことに気付いてください。
クエリ プランの例を表示する
Query Plan Viewer で、[ファイル]>[開く]を使用して example1.qpf () を開きます。次のようなものが表示されます。
比較のために、Query Plan Viewer で example2.qpf を開きます。次のようなものが表示されます。
このプランについて、次の点に注目してください。
この例と同じように自分で作成したクエリを比較すれば、どのような構文および構造が自分の要求に適合しているかを判断することができます。