sp_control_plan_guide (Transact-SQL)

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

主题链接图标Transact-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
    禁用当前数据库中的所有计划指南。指定 DISABLE ALL 时,不能指定 **N'**plan_guide_name 。

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

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

注释

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

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

可以在任何版本的 SQL Server 中使用 DROP 或 DROP ALL 选项执行 sp_control_plan_guide;但其他所有选项仅在 Standard 和 Enterprise Edition 中可用。

权限

若要对类型为 OBJECT(通过指定 @type ='OBJECT' 来创建)的计划指南执行 sp_control_plan_guide,需要对该计划指南引用的对象具有 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. 禁用当前数据库中的所有计划指南

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

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