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

    重要な注意事項重要

    SET SHOWPLAN_XML を使用してクエリ プランを生成するときは、プランに表示される引用符 (') にもう 1 つの引用符を付けてエスケープしないと、USE PLAN クエリ ヒントを指定してプランを使用することはできません。たとえば、WHERE A.varchar = 'This is a string' を含むプランは、コードを WHERE A.varchar = ''This is a string'' のように変更してエスケープする必要があります。

  • SET STATISTICS XML

  • 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 クエリ ヒントの使用」を参照してください。