分享方式:


建立新的計畫指南

適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體

計畫指南是將查詢提示或固定的查詢計畫附加至查詢,以影響查詢的最佳化。 在計劃指南中,指定您要最佳化的陳述式或包含您想要使用之查詢提示的 OPTION 子句, 或者是您想要用來將查詢進行最佳化的特定查詢計劃。 執行查詢時,查詢最佳化工具會比對 Transact-SQL 陳述式與計劃指南,在執行階段將 OPTION 子句附加至查詢,或使用指定的查詢計劃。

計劃指南會將固定查詢計劃及/或查詢提示套用至查詢。

限制事項

  • sp_create_plan_guide 的引數必須依照顯示順序提供。 當您提供 sp_create_plan_guide的參數值時,必須明確指定所有的參數名稱,或是完全不指定。 例如,如果指定了 @name =,您也必須指定 @stmt =@type = 等等。 同樣地,如果省略 @name =,而只提供參數值,您也必須省略其餘參數名稱,只提供它們的值。 引數名稱僅供描述用途,以協助您了解語法。 SQL Server 不會驗證指定的參數名稱是否符合該名稱所用位置的參數名稱。

  • 您可以針對相同的查詢和批次或模組,建立一個以上的 OBJECT 或 SQL 計畫指南。 但是,在任何指定的時間內,只能啟用一個計畫指南。

  • 若 @module_or_batch 值參考的預存程序、函數或 DML 觸發程序指定了 WITH ENCRYPTION 子句或是暫時項目,您就不能為這個值建立 OBJECT 類型的計畫指南。

  • 試圖卸除或修改計畫指南所參考的函數、預存程序或 DML 觸發程序,不論是已啟用或已停用,都會造成錯誤。 嘗試卸除定義了觸發程序且被計畫指南參考的資料表也會造成錯誤。

權限

若要建立類型為 OBJECT 的計劃指南,您需要所參考物件的 ALTER 權限。 若要建立類型為 SQL 或 TEMPLATE 的計劃指南,您需要目前資料庫的 ALTER 權限。

使用 SSMS 建立計劃指南

  1. 按一下加號,展開您要在其中建立計畫指南的資料庫,然後按一下加號展開 [可程式性] 資料夾。

  2. 以滑鼠右鍵按一下 [計劃指南] 資料夾,然後選取 [新增計劃指南…]。select_plan_guide

  3. [新增維護計畫] 對話方塊中的 [名稱] 方塊,輸入計畫指南的名稱。

  4. 在 [陳述式] 方塊中,輸入要套用計劃指南的 Transact-SQL 陳述式。

  5. 在 [範圍類型] 清單中,選取顯示 Transact-SQL 陳述式的實體類型。 這會指定 Transact-SQL 陳述式要與計劃指南相符的內容。 可能的值是 OBJECTSQL,以及 TEMPLATE

  6. 在 [範圍批次] 方塊中,輸入顯示 Transact-SQL 陳述式的批次文字。 批次文字不能包含 USEdatabase 陳述式。 [範圍批次] 方塊只在 [SQL] 選定為範圍類型時才可供使用。 如果 SQL 是範圍類型,但未在 [範圍批次] 方塊中輸入任何內容時,批次文字的值會設為與 [陳述式] 方塊中的值相同。

  7. [範圍結構描述名稱] 清單中,輸入包含了該物件的結構描述名稱。 [範圍結構描述名稱] 方塊只在 [物件] 選定為範圍類型時才可供使用。

  8. 在 [範圍物件名稱] 方塊中,輸入 Transact-SQL 預存程序名稱、使用者定義的純量值函式、多重陳述式資料表值函式,或出現 Transact-SQL 陳述式的 DML 觸發程序。 [範圍物件名稱] 方塊只在 [物件] 選定為範圍類型時才可供使用。

  9. 在 [參數] 方塊中,針對 Transact-SQL 陳述式中內嵌的所有參數輸入參數名稱與資料類型。

    只有在下列兩者之一為真時,才套用參數:

    • 範圍類型為 SQLTEMPLATE。 如果是 TEMPLATE,參數必須不是 NULL。

    • Transact-SQL 陳述式會使用 sp_executesql 和指定參數的值提交,或在參數化後由 SQL Server 內部提交。

  10. 在 [提示] 方塊中,輸入要套用至 Transact-SQL 陳述式的查詢提示或查詢計劃。 如需指定一或多個查詢提示,請輸入有效的 OPTION 子句。

  11. 按一下 [確定]。

plan_guide

使用 T-SQL 建立計劃指南

  1. 在物件總管中,連線到資料庫引擎的執行個體。

  2. 在標準列上,按一下 [新增查詢]

  3. 複製下列範例並將其貼到查詢視窗中,然後按一下 [執行]

    -- creates a plan guide named Guide1 based on a SQL statement  
    EXEC sp_create_plan_guide   
        @name = N'Guide1',   
        @stmt = N'SELECT TOP 1 *   
                  FROM Sales.SalesOrderHeader   
                  ORDER BY OrderDate DESC',   
        @type = N'SQL',  
        @module_or_batch = NULL,   
        @params = NULL,   
        @hints = N'OPTION (MAXDOP 1)';  
    
    

如需詳細資訊,請參閱 sp_create_plan_guide (Transact-SQL)