sp_control_plan_guide (Transact-SQL)

适用于:yes (所有受支持的版本的 SQL Server)

删除、启用或禁用计划指南。

Topic link iconTransact-SQL 语法约定

语法

  
sp_control_plan_guide [ @operation = ] N'<control_option>'  
  [ , [ @name = ] N'plan_guide_name' ]  
  
<control_option>::=  
{   
    DROP   
  | DROP ALL  
  | DISABLE  
  | DISABLE ALL  
  | ENABLE   
  | ENABLE ALL  
}  

参数

N 'plan_guide_name'
指定被删除、启用或禁用的计划指南。 plan_guide_name 解析为当前数据库。 如果未指定, plan_guide_name 默认为 NULL。

DROP
删除 plan_guide_name指定的计划指南。 删除计划指南后,以后再执行以前与该计划指南匹配的查询时将不受该计划指南的影响。

DROP ALL
删除当前数据库中的所有计划指南。 当指定 DROP ALL 时,不能指定N 'plan_guide_name

DISABLE
禁用 plan_guide_name指定的计划指南。 禁用计划指南后,以后再执行以前与该计划指南匹配的查询时将不受该计划指南的影响。

DISABLE ALL
禁用当前数据库中的所有计划指南。 指定 "禁用 ALL" 时,不能指定N 'plan_guide_name

ENABLE
启用 plan_guide_name指定的计划指南。 启用计划指南后,可以使其与合格查询匹配。 默认情况下,计划指南在创建时启用。

ENABLE ALL
启用当前数据库中的所有计划指南。 指定了 ENABLE ALL 时,不能指定N 'plan_guide_name* * * *。

注解

如果尝试删除或修改的函数、存储过程或 DML 触发器由某个计划指南引用,则不管该指南为启用状态还是禁用状态,都会导致错误。

禁用一个已禁用的计划指南或启用一个已启用的计划指南将不起作用,且运行时没有错误。

MicrosoftSQL Server 的每个版本中均未提供计划指南。 有关 SQL Server 各版本支持的功能列表,请参阅 SQL Server 2016 的版本和支持的功能。 不过,您可以在任何版本的 SQL Server 中,用 DROP 或 DROP ALL 选项执行sp_control_plan_guide

权限

若要对 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';  

B. 禁用当前数据库中的所有计划指南

下面的示例禁用 AdventureWorks2012 数据库中的所有计划指南。

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

另请参阅

数据库引擎存储过程 (Transact-SQL)
系统存储过程 (Transact-SQL)
sp_create_plan_guide (Transact-SQL)
sys.plan_guides (Transact-SQL)
计划指南