使用 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 參數。
重要事項 |
---|
您應該都要藉由指定 N 前置詞來指定 xml_plan 做為 Unicode 常值,就像在 N'xml_plan' 中一般。這樣做可確保 Unicode 標準的特定計畫中,所有字元皆不會在 SQL Server Database Engine 解譯字串時遺失。 |
在 SQL Server 中,XML 格式的查詢計畫可透過下列方式來產生:
-
重要事項 若您使用 SET SHOWPLAN_XML 產生查詢計畫,則在搭配使用此計畫與 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> 元素的路徑下,必須具有下列其中一個元素:
一或多個 <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 查詢提示>。