使用 SQL Server Profiler 建立及測試計畫指南
適用於: SQL Server Azure SQL 資料庫
當您建立計劃指南時,可使用 SQL Server Profiler 來擷取精確的查詢文字,以供使用於 sp_create_plan_guide 預存程序的 statement_text 引數。 這有助於確保計畫指南符合編譯時期的查詢。 在建立計劃指南之後,SQL Server Profiler 也可用來測試計劃指南實際上是否符合查詢。 一般而言,您應該使用 SQL Server Profiler 來測試計劃指南,以確認查詢符合您的計劃指南。
使用 SQL Server Profiler 擷取查詢文字
如果您執行查詢並使用 SQL Server Profiler 來擷取與提交至 SQL Server 完全相同的文字,您可以建立 SQL 或 TEMPLATE 型別的計劃指南來完全符合查詢文字。 這可確保計畫指南是由查詢最佳化工具使用。
請看應用程式以獨立批次提交的下列查詢:
SELECT COUNT(*) AS c
FROM Sales.SalesOrderHeader AS h
INNER JOIN Sales.SalesOrderDetail AS d
ON h.SalesOrderID = d.SalesOrderID
WHERE h.OrderDate BETWEEN '20000101' and '20050101';
假設您要此查詢使用合併聯結作業執行,但 SHOWPLAN 指出該查詢不是使用合併聯結。 您不能在應用程式中直接變更查詢,而是要建立計畫指南來指定在編譯時期將 MERGE JOIN 查詢提示附加至查詢。
若要擷取和 SQL Server 所接收的一模一樣的查詢文字,請遵循這些步驟:
啟動 SQL Server Profiler 追蹤,確定已選取 [SQL:BatchStarting] 事件類型。
讓應用程式執行查詢。
暫停 SQL Server Profiler 追蹤。
按一下對應到此查詢的 [SQL:BatchStarting] 事件。
以滑鼠右鍵按一下,並選取 [擷取事件資料]。
重要
請勿嘗試從 Profiler 追蹤視窗的下方窗格選取要複製的批次文字。 這可能造成建立的計畫指南與原始批次不符。
將事件資料儲存至檔案。 這是批次文字。
在 [記事本] 中開啟批次文字檔,將文字複製到「複製與貼上緩衝區」。
建立計畫指南,並將所複製的文字貼到@stmt引數所指定的引號內 ( '' )。 您必須在 @stmt 引數中的單引號前加上另一個單引號,以免除所有單引號。 當您插入這些單引號的時候,請小心不要加入或移除任何其他字元。 例如,您必須將 '20000101' 日期常值分隔為 ''20000101''。
以下是計畫指南:
EXEC sp_create_plan_guide
@name = N'MyGuide1',
@stmt = N'<paste the text copied from the batch text file here>',
@type = N'SQL',
@module_or_batch = NULL,
@params = NULL,
@hints = N'OPTION (MERGE JOIN)';
使用 SQL Server Profiler 測試計畫指南
若要確認計畫指南符合查詢,請遵循這些步驟:
啟動 SQL Server Profiler 追蹤,確定已選取 [執行程序表 XML] 事件類型 (位於 [效能] 節點之下)。
讓應用程式執行查詢。
暫停 SQL Server Profiler 追蹤。
為受影響的查詢尋找 [執行程序表 XML] 事件。
注意
不可使用 [Showplan XML for Query Compile] 事件。 [PlanGuideDB] 不存在該事件中。
如果計畫指南的類型為 OBJECT 或 SQL,請確認 [執行程序表 XML] 事件包含您預期符合查詢之計畫指南的 PlanGuideDB 和 PlanGuideName 屬性。 若為 TEMPLATE 計畫指南,則請確認 [執行程序表 XML] 事件包含預期計畫指南的 TemplatePlanGuideDB 和 TemplatePlanGuideName 屬性。 這可確認計畫指南有用。 這些屬性包含在計劃的 <StmtSimple> 項目之下。