USE PLAN クエリ ヒントの使用
USE PLAN クエリ ヒントは引数として xml_plan を受け取ります。xml_plan は、クエリに対して生成された XML 形式のクエリ プランから派生する文字列リテラルです。
重要 : |
---|
xml_plan は必ず、N'xml_plan' のように、N プレフィックスを指定して Unicode リテラルとして示す必要があります。こうすることで、SQL Server 2005 データベース エンジンで文字列が解釈されるときに、プラン内の Unicode 標準固有の文字が失われないようにします。 |
SQL Server 2005 では、次の方法で 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 2005 インストール ディレクトリにある 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 |
---|---|---|---|
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
|
該当なし |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
|
|
|
|
該当なし |
|
|
|
該当なし |
|
|
|
|
|
|
|
(テーブル値関数名は 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 クエリ ヒントの使用」を参照してください。
参照
概念
その他の技術情報
ヘルプおよび情報
変更履歴
リリース | 履歴 |
---|---|
2007 年 9 月 15 日 |
|