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中指定的计划指南执行的操作。 @operationnvarchar(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(已创建指定)@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';
GO

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

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

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