创建新计划指南

可以使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中创建计划指南。 计划指南通过将查询提示或固定查询计划附加到查询中来影响查询优化。 在计划指南中,您需要指定要优化的 Transact-SQL 语句,并选择包含所需查询提示的 OPTION 子句,或选择一个特定的查询计划用于优化该查询。 执行查询时,查询优化器会将 Transact-SQL 语句与计划指南匹配,并在运行时将 OPTION 子句附加到查询或使用指定的查询计划。

本主题内容

在您开始之前

局限性与限制

  • 必须按显示的顺序提供sp_create_plan_guide的参数。 为参数 sp_create_plan_guide提供值时,必须显式指定所有参数名称,或者根本不指定任何参数名称。 例如,如果@name =被指定,那么@stmt =@type =等也必须指定。 同样,如果 @name = 省略并且只提供参数值,则还必须省略其余参数名称,并且只提供其值。 参数名称仅用于描述性目的,以帮助了解语法。 SQL Server 不验证指定的参数名称是否与使用名称的位置的参数名称匹配。

  • 可以为同一查询和批处理或模块创建多个 OBJECT 或 SQL 计划指南。 但是,在任何给定时间只能启用一个计划指南。

  • 无法为 @module_or_batch 引用指定 WITH ENCRYPTION 子句或临时的存储过程、函数或 DML 触发器的值创建 OBJECT 类型的计划指南。

  • 尝试删除或修改计划指南引用的函数、存储过程或 DML 触发器(启用或禁用)会导致错误。 尝试删除由计划指南引用并定义了触发器的表也会导致错误。

安全

权限

若要创建 OBJECT 类型的计划指南,需要对引用的对象具有 ALTER 权限。 若要创建 SQL 或 TEMPLATE 类型的计划指南,需要对当前数据库具有 ALTER 权限。

使用 SQL Server Management Studio

创建计划指南

  1. 单击加号以展开要在其中创建计划指南的数据库,然后单击加号以展开 “可编程性 ”文件夹。

  2. 右键单击 “计划指南 ”文件夹,然后选择“ 新建计划指南...”

  3. 在“ 新建计划指南 ”对话框中的“ 名称 ”框中,输入计划指南的名称。

  4. “语句 ”框中,输入要对其应用计划指南的 Transact-SQL 语句。

  5. “作用域类型 ”列表中,选择显示 Transact-SQL 语句的实体类型。 这指定用于将 Transact-SQL 语句与计划指南匹配的上下文。 可能的值为 OBJECTSQLTEMPLATE

  6. “作用域批处理 ”框中,输入显示 Transact-SQL 语句的批处理文本。 批处理文本不能包含 USEdatabase 语句。 仅当选择 SQL 作为范围类型时,“范围”批处理框才可用。 如果 SQL 是范围类型时未在范围批处理框中输入任何内容,则将批处理文本的值设置为与 语句 框中的值相同。

  7. “作用域架构名称 ”列表中,输入包含对象的架构的名称。 “ 作用域架构名称 ”框仅在 选择“对象 ”作为范围类型时才可用。

  8. “作用域对象名称 ”框中,输入 Transact-SQL 存储过程、用户定义的标量函数、多语句表值函数或 DML 触发器的名称,其中显示 Transact-SQL 语句。 “ 作用域对象名称 ”框仅在 选择“对象 ”作为范围类型时才可用。

  9. “参数 ”框中,输入 Transact-SQL 语句中嵌入的所有参数的参数名称和数据类型。

    仅当以下任一为 true 时,参数才适用:

    • 范围类型为 SQLTEMPLATE。 如果 TEMPLATE,参数不得为 NULL。

    • Transact-SQL 语句是使用 sp_executesql 提交的,并且指定了参数的值,或者 SQL Server 在参数化后在内部提交语句。

  10. “提示 ”框中,输入要应用于 Transact-SQL 语句的查询提示或查询计划。 若要指定一个或多个查询提示,请输入有效的 OPTION 子句。

  11. 单击 “确定”

使用 Transact-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)。