使用 USE PLAN 查詢提示
USE PLAN 查詢提示會以 xml_plan 做為引數。xml_plan 是由針對查詢所產生的 XML 格式查詢計劃衍生出來的字串常值。
重要事項: |
---|
您應該都要藉由指定 N 前置詞來指定 xml_plan 做為 Unicode 常值,就像在 N'xml_plan' 中一般。這樣做可確保 Unicode 標準的特定計劃中,所有字元皆不會在 SQL Server 2005 Database Engine 解譯字串時遺失。 |
在 SQL Server 2005 中,XML 格式的查詢計劃可透過下列方式來產生:
- SET SHOWPLAN_XML
重要事項: 若您使用 SET SHOWPLAN_XML 產生查詢計劃,則在搭配使用此計劃與 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>
元素的路徑下,必須具有下列其中一個元素:
- 一或多個
<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 |
---|---|---|---|
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
|
|
|
|
|
|
|
|
不適用 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
|
|
|
|
不適用 |
|
|
|
不適用 |
|
|
|
|
|
|
|
(資料表值函數的名稱為 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 查詢提示>。
請參閱
概念
其他資源
說明及資訊
變更歷程記錄
版本 | 歷程記錄 |
---|---|
2007 年 9 月 15 日 |
|