移轉查詢計劃
在大部分情況下,將資料庫升級至最新版本的SQL Server將會導致改善查詢效能。 但是,如果您的關鍵任務查詢已針對效能謹慎地加以微調,您可能會想要在升級之前為這些查詢保留查詢計劃,透過的方式是為每一個查詢建立計畫指南。 如果在升級之後,查詢最佳化工具針對一個或多個查詢選擇比較沒有效率的計畫,您可啟用計畫指南,並強制查詢最佳化工具使用升級前計畫。
若要在升級之前建立計畫指南,請遵循以下步驟:
使用 sp_create_plan_guide 預存程式,並在 USE PLAN 查詢提示中指定查詢計劃,記錄每個任務關鍵性查詢的目前計畫。
確認此計畫指南已套用到查詢。
將資料庫升級至較新版本的 SQL Server。
計畫會保存在升級資料庫的計畫指南中,而且會在升級之後的計畫退步情況下當做後援。
我們建議您在升級之後不要啟用計畫指南,因為您可能會因為更新的統計資料,而遺失在新版中擁有更佳計畫或有幫助的重新編譯機會。
如果在升級之後選擇了比較沒有效率的計畫,請啟動計畫指南的全部或子集來覆寫新的計畫。
範例
下列範例會示範如何藉由建立計畫指南來為查詢記錄升級前計畫。
步驟 1:收集計畫
計畫指南中所記錄的查詢計劃必須使用 XML 格式。 XML 格式的查詢計劃可透過下列方式來產生:
查詢sys.dm_exec_query_plan動態管理功能的 query_plan 資料行。
SQL Server Profiler Showplan XML、Showplan XML Statistics Profile和Showplan XML For Query Compile事件類別。
下列範例會藉由查詢動態管理檢視來為 SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;
陳述式收集查詢計畫。
USE AdventureWorks;
GO
SELECT query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp
WHERE st.text LIKE N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;%';
GO
步驟 2:建立計畫指南以強制計畫
在計畫指南中使用 XML 格式的查詢計畫 (由上述的任何一個方法取得),可在 sp_create_plan_guide 的 OPTION 子句中所指定的 USE PLAN 查詢提示內,以字串常值的形式複製並貼上查詢計畫。
在 XML 計畫本身內,以第二個引號逸出計畫中所出現的引號 ('),然後再建立計畫指南。 例如,含有 WHERE A.varchar = 'This is a string'
的計畫必須將程式碼修改為 WHERE A.varchar = ''This is a string''
而加以逸出。
下列範例會針對步驟 1 收集的查詢計劃建立計畫指南,並將此查詢的 XML 執行程序表插入 @hints
參數內。 為了簡潔起見,只有部分的執行程序表輸出包含在此範例中。
EXECUTE sp_create_plan_guide
@name = N'Guide1',
@stmt = N'SELECT City, StateProvinceID, PostalCode FROM Person.Address ORDER BY PostalCode DESC;',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION(USE PLAN N''<ShowPlanXML xmlns=''''https://schemas.microsoft.com/sqlserver/2004/07/showplan''''
Version=''''0.5'''' Build=''''9.00.1116''''>
<BatchSequence><Batch><Statements><StmtSimple>
...
</StmtSimple></Statements></Batch>
</BatchSequence></ShowPlanXML>'')';
GO
步驟 3:確認此計畫指南已套用到查詢
再次執行此查詢,並檢查所產生的查詢計劃。 您應該會發現此計畫符合您在計畫指南中所指定的計畫。
另請參閱
sp_create_plan_guide (Transact-SQL)
查詢提示 (Transact-SQL)
計畫指南