分享方式:


sp_control_plan_guide (Transact-SQL)

適用於:SQL Server

系統 sp_control_plan_guide 預存程式可用來卸除、啟用或停用計劃指南。

Transact-SQL 語法慣例

語法

sp_control_plan_guide
    [ @operation = ] { N'DROP [ ALL ]' | N'DISABLE [ ALL ]' | N'ENABLE [ ALL ]' }
    [ , [ @name = ] N'name' ]
[ ; ]

引數

[ @name = ] N'name'

指定正在卸除、啟用或停用的計劃指南。 @name為 sysname,預設值為 NULL@name解析為目前的資料庫。 如果未指定, @name 預設為 NULL

[ @operation = ] { N'DROP [ ALL ]' |N'DISABLE [ ALL ]' |N'ENABLE [ ALL ]' }

在 @name 中指定的計劃指南上執行的作業。 @operation為 nvarchar(60),沒有預設值。

  • DROP

    卸除@name指定的計劃指南。 卸除計劃指南之後,計劃指南先前比對的查詢未來執行不會受到計劃指南的影響。

  • DROP ALL

    卸除目前資料庫中的所有計劃指南。 指定時DROP ALL無法指定@name

  • DISABLE

    停用@name指定的計劃指南。 停用計劃指南之後,計劃指南先前比對的查詢未來執行不會受到計劃指南的影響。

  • DISABLE ALL

    停用目前資料庫中的所有計劃指南。 指定時DISABLE ALL無法指定@name

  • ENABLE

    啟用@name指定的計劃指南。 方案指南可以在啟用之後,與合格的查詢進行比對。 根據預設,計劃指南會在建立時啟用。

  • ENABLE ALL

    啟用目前資料庫中的所有計劃指南。 指定時ENABLE ALL無法指定@name

備註

試圖卸除或修改計畫指南所參考的函數、預存程序或 DML 觸發程序,不論是已啟用或已停用,都會造成錯誤。

停用已停用的計畫指南,或啟用已啟用的計畫指南,都沒有作用,執行時也不會發生錯誤。

每個版本的 SQL Server 都無法使用方案指南。 如需 SQL Server 版本支援的功能清單,請參閱 SQL Server 2022 的版本和支援功能。 不過,您可以在任何版本的 SQL Server 中使用 或 DROP ALL 選項來執行sp_control_plan_guideDROP

權限

在類型的OBJECT計劃指南上執行 sp_control_plan_guide (已建立指定 @type = '<object>') 需要ALTER計劃指南所參考之對象的許可權。 所有其他計劃指南都需要 ALTER DATABASE 許可權。

範例

A. 啟用、停用和卸除計劃指南

下列範例會建立計劃指南、將其停用、啟用,然後卸除。

--Create a procedure on which to define the plan guide.
IF OBJECT_ID(N'Sales.GetSalesOrderByCountry', N'P') IS NOT NULL
    DROP PROCEDURE Sales.GetSalesOrderByCountry;
GO

CREATE PROCEDURE Sales.GetSalesOrderByCountry (@Country NVARCHAR(60))
AS
BEGIN
    SELECT *
    FROM Sales.SalesOrderHeader AS h
    INNER JOIN Sales.Customer AS c
        ON h.CustomerID = c.CustomerID
    INNER JOIN Sales.SalesTerritory AS t
        ON c.TerritoryID = t.TerritoryID
    WHERE t.CountryRegionCode = @Country;
END
GO

--Create the plan guide.
EXEC sp_create_plan_guide N'Guide3',
    N'SELECT *
    FROM Sales.SalesOrderHeader AS h
    INNER JOIN Sales.Customer AS c
        ON h.CustomerID = c.CustomerID
    INNER JOIN Sales.SalesTerritory AS t
        ON c.TerritoryID = t.TerritoryID
    WHERE t.CountryRegionCode = @Country',
    N'OBJECT',
    N'Sales.GetSalesOrderByCountry',
    NULL,
    N'OPTION (OPTIMIZE FOR (@Country = N''US''))';
GO

--Disable the plan guide.
EXEC sp_control_plan_guide N'DISABLE',
    N'Guide3';
GO

--Enable the plan guide.
EXEC sp_control_plan_guide N'ENABLE',
    N'Guide3';
GO

--Drop the plan guide.
EXEC sp_control_plan_guide N'DROP',
    N'Guide3';
GO

B. 停用目前資料庫中的所有計劃指南

下列範例會停用資料庫中的所有計劃指南 AdventureWorks2022

USE AdventureWorks2022;
GO
EXEC sp_control_plan_guide N'DISABLE ALL';