USE PLAN クエリ ヒントの使用
USE PLAN クエリ ヒントは引数として xml_plan を受け取ります。xml_plan は、クエリに対して生成された XML 形式のクエリ プランから派生する文字列リテラルです。USE PLAN クエリ ヒントは、スタンドアロン SQL ステートメントでクエリ ヒントとして指定できます。または、プラン ガイドの @hints パラメータに指定できます。クエリ プランをプラン ガイドに適用する場合は、sp_create_plan_guide ストアド プロシージャまたは sp_create_plan_guide_from_handle ストアド プロシージャで xml_showplan パラメータを使用することをお勧めします。
重要 |
---|
xml_plan は必ず、N'xml_plan' のように、N プレフィックスを指定して Unicode リテラルとして示す必要があります。こうすることで、SQL Server データベース エンジンで文字列が解釈されるときに、プラン内の Unicode 標準固有の文字が失われないようにします。 |
SQL Server では、次の方法で XML 形式のクエリ プランを生成できます。
-
重要 SET SHOWPLAN_XML を使用してクエリ プランを生成するときは、プランに表示される引用符 (') にもう 1 つの引用符を付けてエスケープしないと、USE PLAN クエリ ヒントを指定してプランを使用することはできません。たとえば、WHERE A.varchar = 'This is a string' を含むプランは、コードを WHERE A.varchar = ''This is a string'' のように変更してエスケープする必要があります。
sys.dm_exec_query_plan 動的管理関数の query_plan 列へのクエリ
SQL Server Profiler の Showplan XML イベント クラス、Showplan XML Statistics Profile イベント クラス、および Showplan XML For Query Compile イベント クラス
クエリ プランの生成および分析の詳細については、「クエリの分析」を参照してください。
xml_plan で指定された XML 形式のクエリ プランは、SQL Server インストール ディレクトリにある XSD スキーマ Showplanxml.xsd に対して検証する必要があります。また、<ShowPlanXML> <BatchSequence> <Batch> <Statements> 要素を含むパスの下に、次のいずれかが必要です。
1 つ以上の <StmtSimple> 要素。これらの要素には <QueryPlan> サブ要素が 1 つだけ含まれます。
<CursorPlan> サブ要素を 1 つだけ含む、1 つの <StmtCursor> 要素。
<QueryPlan> サブ要素を含まない 1 つ以上の <StmtSimple> 要素、および 1 つの <CursorPlan> サブ要素を含む 1 つの <StmtCursor> 要素。
USE PLAN を使用して、プランを使用前に変更できます。この変更は、たとえば、結合順序や結合演算子を変更したり、スキャンとシークを調整することで行います。ただし、プランの形式は変更後も Showplanxml.xsd と一致する必要があります。変更されたプランを強制的に使用できないことがあります。USE PLAN ヒントで使用するプランが、SQL Server が最適化中に通常はクエリと見なすプランのいずれでもない場合、エラーが発生します。
USE PLAN クエリ ヒントを使用して生成されたクエリ プランは、他のクエリ プランと同様にキャッシュされます。
USE PLAN クエリ ヒントの制限事項
インデックスの削除など、データベースを変更すると、USE PLAN で指定したクエリ プランが無効になることがあります。削除したオブジェクトがクエリ プラン内で直接参照されない場合でも、そのプランが使用されなくなる可能性があります。たとえば、一意インデックスがクエリ プラン内で明示的に参照されていなくても、一意インデックスにより、一意性制約がデータに適用されることがあります。USE PLAN によって参照されるクエリ プランでは、この制約を使用して、差異を生じさせる特定の演算子が使用されないようにできます。
場合によっては、SQL Server の Service Pack や新しいリリースをインストールすると、以前のバージョンで生成されたプランを使用できなくなることがあります。したがって、サーバーをアップグレードするたびに、すべての USE PLAN ヒントをテストする必要があります。
クエリで USE PLAN ヒントを使用すると、同じクエリで使用しているすべての結合ヒントやインデックス ヒントよりも優先されます。
USE PLAN は、FORCE ORDER、EXPAND VIEWS、GROUP、UNION、または JOIN クエリ ヒントと共に使用したり、SET FORCEPLAN が ON に設定されている場合に使用することはできません。
USE PLAN を使用して設定できるのは、クエリ オプティマイザの通常の検索方法で見つけることができるクエリ プランのみです。一般に、このようなプランにより、各結合の 1 つの子がリーフ レベルにあることが指定されます。USE PLAN を使用して他の種類のクエリを設定すると、エラーが発生します。
適用されるクエリ プラン要素
XML 形式のクエリ プランのすべての要素が USE PLAN ヒントを使用して適用されるわけではありません。スカラ式を計算する要素は無視され、一部の関係式も無視されます。次の種類の要素の場合、クエリ プランが適用されます。
プランのツリー構造と評価の順序。
結合の種類、並べ替え、および和集合などの実行アルゴリズム。
スキャン、シーク、積集合、および和集合などのインデックス操作。
他のテーブル、インデックス、および関数などの明示的に参照されるオブジェクト。
具体的には、SQL Server では、<RelOp> 要素の下で見つかった LogicalOp アイテム、PhysicalOp アイテム、および NodeID アイテムが適用され、<PhysicalOp> 操作に関連するすべてのサブ要素も適用されます。<RelOp> 要素の下の他のコンテンツは、USE PLAN では考慮されません。
重要 |
---|
<EstimateRows> 要素によって指定された基数の算出に関する情報は、USE PLAN クエリ ヒントでは適用されません。クエリ オプティマイザでは、基数の算出によりクエリの実行に使用するメモリ量が決定されるので、USE PLAN を使用している場合でも、正確な統計を保持する必要があります。詳細については、「クエリのパフォーマンスを向上させるための統計の使用」を参照してください。 |
次の表に、PhysicalOp アイテムと LogicalOp アイテムの両方に対する USE PLAN クエリ ヒントで適用される関係演算子の値、および PhysicalOp 値ごとに必要なすべてのサブ要素を示します。また、この表には、操作ごとに必要な追加情報も、XPath スタイルのサブ要素からの相対パス形式で含まれています。
PhysicalOp |
LogicalOp |
サブ要素 |
追加情報1 |
---|---|---|---|
Concatenation |
Concatenation Async Concat |
Concat |
該当なし |
Constant Scan |
Constant Scan |
ConstantScan |
該当なし |
Deleted Scan |
Deleted Scan |
DeletedScan |
Object/@Table |
UDX |
UDX |
Extension |
@UDXName |
Hash Match |
Inner Join Left Outer Join Right Outer Join Full Outer Join Left Semi Join Left Anti Semi Join Right Semi Join Right Anti Semi Join Aggregate Partial Aggregate Flow Distinct Union |
Hash |
該当なし |
RID Lookup |
RID Lookup |
IndexScan |
Object/@Database, Object/@Schema, Object/@Table |
Index Scan Clustered Index Scan |
Index Scan Clustered Index Scan |
IndexScan |
Object/@Database, Object/@Schema, Object/@Table Object/@Index |
Index Seek Clustered Index Seek |
Index Seek Clustered Index Seek |
IndexScan |
Object/@Database, Object/@Schema, Object/@Table Object/@Index |
Inserted Scan |
Inserted Scan |
InsertedScan |
Object/@Table |
Log Row Scan |
Log Row Scan |
LogRowScan |
該当なし |
Merge Join |
Inner Join Left Outer Join Right Outer Join Full Outer Join Left Semi Join Left Anti Semi Join Right Semi Join Right Anti Semi Join Cross Join Concatenation Union |
Merge |
該当なし |
Merge Interval |
Merge Interval |
MergeInterval |
該当なし |
Nested Loops |
Inner Join Left Outer Join Right Outer Join Full Outer Join Left Semi Join Left Anti Semi Join Right Semi Join Right Anti Semi Join Cross Join |
NestedLoops |
該当なし |
Parallelism |
Gather Streams Repartition Streams Distribute Streams |
Parallelism |
該当なし |
Row Count Spool |
Eager Spool Lazy Spool |
RowCountSpool2 |
該当なし |
Segment |
Segment |
Segment |
該当なし |
Sequence |
Sequence |
Sequence |
該当なし |
Sequence Project |
Compute Scalar |
SequenceProject |
該当なし |
Sort |
Sort Distinct Sort |
Sort |
該当なし |
Table Spool Index Spool |
Eager Spool Lazy Spool |
Spool2 |
@PrimaryNodeId (セカンダリ スプールの場合のみ) ../RelOp/@NodeId (プライマリ スプールを表す RelOps の場合のみ) |
Stream Aggregate |
Aggregate |
StreamAggregate |
該当なし |
Switch |
Switch |
Switch |
該当なし |
Table Scan |
Table Scan |
TableScan |
Object/@Database, Object/@Schema, Object/@Table |
Table-valued function |
Table-valued function |
TableValuedFunction |
Object/@Database, Object/@Schema, Object/@Table (テーブル値関数名は Object/@Table) |
Top |
Top |
Top |
該当なし |
Sort |
Sort |
Sort |
該当なし |
Top Sort |
TopN Sort |
TopSort |
該当なし |
Table Insert |
Insert |
Update |
Object/@Table |
1 USE PLAN を使用してプランを適用するには、各関係演算子に対して、これらの入力の数と順序をこの表に示したように指定する必要があります。
2 プランに <RowCountSpool> サブ要素が含まれている場合、プランを適用する機能が制限され、そのサブ要素は <RowCountSpool> サブ要素または <Spool> サブ要素のいずれかとして、適用されたプランに示されることがあります。同様に、プランに <Spool> サブ要素が含まれている場合、そのサブ要素は <Spool> サブ要素または <RowCountSpool> サブ要素として、適用されたプランに示されることがあります。
Assert 操作、Bitmap 操作、ComputeScalar 操作、および PrintDataFlow 操作は USE PLAN では無視されます。Filter 操作は USE PLAN で考慮されますが、この操作のプラン内の正確な場所を設定することはできません。
クエリ プランで使用する論理操作および物理操作の詳細については、「論理操作と物理操作のリファレンス」を参照してください。
カーソルのサポート
USE PLAN クエリ ヒントは、要求元が Transact-SQL か API カーソル関数かに関係なく、静的カーソルまたは高速順方向専用カーソルを指定するクエリと共に使用できます。順方向専用オプションを適用した Transact-SQL 静的カーソルはサポートされます。動的カーソル、キーセット ドリブン カーソル、および順方向専用カーソルはサポートされません。
詳細については、「カーソルを使用したクエリでの USE PLAN クエリ ヒントの使用」を参照してください。