使用 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完全相同的查詢文字,請遵循下列步驟:

  1. 啟動SQL Server Profiler追蹤,確定已選取SQL:BatchStarting事件種類。

  2. 讓應用程式執行查詢。

  3. 暫停SQL Server Profiler追蹤。

  4. 按一下對應到此查詢的 [SQL:BatchStarting] 事件。

  5. 以滑鼠右鍵按一下,並選取 [擷取事件資料]。

    重要事項

    請勿嘗試從 Profiler 追蹤視窗的下方窗格選取要複製的批次文字。 這可能造成建立的計畫指南與原始批次不符。

  6. 將事件資料儲存至檔案。 這是批次文字。

  7. 在 [記事本] 中開啟批次文字檔,將文字複製到「複製與貼上緩衝區」。

  8. 建立計劃指南,並將複製的文字貼到為@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 測試計畫指南

若要確認計畫指南符合查詢,請遵循這些步驟:

  1. 啟動SQL Server Profiler追蹤,確定已選取Showplan XML事件種類, (位於[效能] 節點) 底下。

  2. 讓應用程式執行查詢。

  3. 暫停SQL Server Profiler追蹤。

  4. 為受影響的查詢尋找 [執行程序表 XML] 事件。

    注意

    不可使用 [Showplan XML for Query Compile] 事件。 [PlanGuideDB] 不存在該事件中。

  5. 如果計畫指南的類型為 OBJECT 或 SQL,請確認 [執行程序表 XML] 事件包含您預期符合查詢之計畫指南的 PlanGuideDBPlanGuideName 屬性。 若為 TEMPLATE 計畫指南,則請確認 [執行程序表 XML] 事件包含預期計畫指南的 TemplatePlanGuideDBTemplatePlanGuideName 屬性。 這可確認計畫指南有用。 這些屬性包含在計畫的StmtSimple > 元素底下 <

另請參閱

sp_create_plan_guide (Transact-SQL)