使用 USE PLAN 查詢提示

USE PLAN 查詢提示會以 xml_plan 做為引數。xml_plan 是由針對查詢所產生的 XML 格式查詢計畫衍生出來的字串常值。此 USE PLAN 查詢提示可以在獨立 SQL 陳述式中指定為查詢提示,也可以在計畫指南的 @hints 參數中指定。若要將查詢計畫附加至計畫指南,我們建議您在 sp_create_plan_guidesp_create_plan_guide_from_handle 預存程序中使用 xml_showplan 參數。

重要事項重要事項

您應該都要藉由指定 N 前置詞來指定 xml_plan 做為 Unicode 常值,就像在 N'xml_plan' 中一般。這樣做可確保 Unicode 標準的特定計畫中,所有字元皆不會在 SQL Server Database Engine 解譯字串時遺失。

在 SQL Server 中,XML 格式的查詢計畫可透過下列方式來產生:

如需產生及分析查詢計畫的詳細資訊,請參閱<分析查詢>。

xml_plan 中指定的 XML 格式查詢計畫,必須依據 SQL Server 安裝目錄中的 XSD 結構描述 Showplanxml.xsd 進行驗證。此外,在含有 <ShowPlanXML> <BatchSequence> <Batch> <Statements> 元素的路徑下,必須具有下列其中一個元素:

  • 一或多個 <StmtSimple> 元素,其中之一含有 <QueryPlan> 子元素。

  • 僅含有一個 <CursorPlan> 子元素的一個 <StmtCursor> 元素。

  • 一或多個不含 <QueryPlan> 子元素的 <StmtSimple> 元素,以及含有一個 <CursorPlan> 子元素的一個 <StmtCursor> 元素。

您可以使用 USE PLAN 在開始使用計畫前予以變更,例如,您可以變更聯結順序與運算子,也可以調整掃描與搜尋。但計畫格式仍需符合 Showplanxml.xsd。對於已變更的計畫,您可能無法加以強制執行。若您在 USE PLAN 提示中所使用的計畫,不屬於 SQL Server 在執行查詢最佳化期間通常會列入考量的計畫之一,則會發生錯誤。

會快取使用 USE PLAN 查詢提示產生的查詢計畫,就像其他查詢計畫一樣。

USE PLAN 查詢提示的限制

若變更資料庫 (如卸除索引),USE PLAN 所指定的查詢計畫即可能無效。即使計畫中並未直接參考被卸除的物件,查詢計畫仍可能變成過時。例如,查詢計畫中可能並未明確地參考某個唯一索引,但該索引還是會對資料強制執行唯一性條件約束。USE PLAN 所參考的查詢計畫,可以使用此條件約束來避免使用特定的運算子強制執行相異性 (distinctness)。

有時候,安裝 Service Pack 或新版 SQL Server 可能會讓您無法強制執行舊版本所產生的計畫。因此,每當升級伺服器後,即應測試所有的 USE PLAN 提示。

在查詢中使用 USE PLAN 提示,會覆寫所有在同一個查詢中使用的聯結提示與索引提示。

USE PLAN 無法與 FORCE ORDER、EXPAND VIEWS、GROUP、UNION 或 JOIN 查詢提示一起使用,或 SET FORCEPLAN 設為 ON 時,也無法使用。

只有查詢最佳化工具的一般搜尋策略所能找到的查詢計畫,才能使用 USE PLAN 加以強制執行。這些計畫通常會指定每個聯結的某個子系必須位於分葉層級上。使用 USE PLAN 強制執行其他類型的查詢將會導致錯誤。

強制執行的查詢計畫元素

並非所有 XML 格式的查詢計畫元素都會使用 USE PLAN 提示來強制執行。計算純量運算式的元素會被忽略,部分關聯運算式也會被忽略。下列類型的元素會強制執行查詢計畫:

  • 計畫樹狀結構與評估順序。

  • 執行演算法,如聯結類型、排序與聯集。

  • 索引作業,如掃描、搜尋、交集與聯集。

  • 明確參考的物件,如其他資料表、索引與函數。

特別是,SQL Server 會強制執行位於 <RelOp> 元素下的 LogicalOp、PhysicalOp 與 NodeID 項目,以及任何有關 <PhysicalOp> 運算子的子元素。USE PLAN 不會考量位於 <RelOp> 元素下的其他內容。

重要事項重要事項

USE PLAN 查詢提示不會強制執行 <EstimateRows> 元素所指定之基數估計值的相關資訊。因為查詢最佳化工具會以基數估計值來判斷執行查詢時所需的記憶體數量,所以您應維持統計資料的正確性,即使使用 USE PLAN,也應如此。如需詳細資訊,請參閱<使用統計資料來改善查詢效能>。

下表列出了針對 PhysicalOp 與 LogicalOp 項目 (以及每個 PhysicalOp 值所需的任何子元素),使用 USE PLAN 查詢提示強制執行的關聯式運算子值。下表也包含了每個運算子 (形式為相對於子元素的 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 (僅適用於代表主要多工緩衝處理的 RelOp)

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> 子元素。

USE PLAN 會忽略 Assert、Bitmap、ComputeScalar 與 PrintDataFlow 運算子。USE PLAN 會考量 Filter 運算子,但無法強制它在計畫中的確切位置。

如需查詢計畫中所使用邏輯與實體運算子的詳細資訊,請參閱<邏輯與實體運算子參考>。

資料指標支援

無論是透過 Transact-SQL 還是 API 資料指標函數來要求,您都可以在指定靜態或快速順向資料指標的查詢中,搭配使用 USE PLAN 查詢提示。可支援含有順向選項的 Transact-SQL 靜態資料指標。不支援動態、索引鍵集驅動與順向資料指標。

如需詳細資訊,請參閱<在含有資料指標的查詢上使用 USE PLAN 查詢提示>。