设计和实现计划指南

更新日期: 2007 年 9 月 15 日

当无法或不打算直接更改查询的文本时,可以使用计划指南来优化查询的性能。 可以创建计划指南来匹配在下列上下文中执行的查询:

  • OBJECT 计划指南可与在 Transact-SQL 存储过程、标量函数、多语句表值函数和 DML 触发器的上下文中执行的查询匹配。
  • SQL 计划指南可与在不属于数据库对象的独立 Transact-SQL 语句和批处理的上下文中执行的查询匹配。 基于 SQL 的计划指南还可用于与参数化为指定形式的查询匹配。
  • TEMPLATE 计划指南可与参数化为指定形式的独立查询匹配。 这些计划指南用于覆盖查询类的数据库的当前 PARAMETERIZATION 数据库 SET 选项。
ms189854.note(zh-cn,SQL.90).gif注意:
计划指南只能在 SQL Server 2005 Standard、Developer、Evaluation 和 Enterprise 版本中使用;但是,在任何版本中均可看到计划指南。 包含计划指南的数据库可以附加到任何版本。 将数据库还原或附加到升级版本的 SQL Server 2005 后,计划指南保持不变。 执行服务器升级后,应验证每个数据库中计划指南的性能。

对于在 sp_create_plan_guide 语句中指定 @type = N'SQL'@type = N'TEMPLATE' 的基于 SQL 或 TEMPLATE 的计划指南,SQL Server 通过逐个字符地比较 @module_or_batch@params 参数的值,使这两个值与查询相匹配。 这意味着必须提供与 SQL Server 在实际批处理中接收的文本完全相同的文本。 若要捕获实际批处理文本,可以使用 SQL Server Profiler。 通常,应该使用 SQL Server Profiler测试计划指南,以验证查询与计划指南是否匹配。 通过从 SQL Server Management Studio 中运行批处理来测试基于 SQL 或 TEMPLATE 的计划指南,可能会产生意外结果。 有关详细信息,请参阅使用 SQL Server Profiler 创建和测试计划指南

ms189854.note(zh-cn,SQL.90).gif注意:
包含要对其创建计划指南的语句的批处理不能包含 USE database 语句。

当将 @type = 'SQL' 和 @module\_or\_batch 设置为 NULL 时,@module_or_batch 的值将设置为 @stmt 的值。 也就是说,在将 statement_text 提交给 SQL Server 时,必须按照完全相同的格式(即每个字符都需相同)来提供其值。 不会执行内部转换来帮助完成该匹配。

计划指南的作用域是创建这些计划指南所用的数据库。 因此,只有在执行查询时处于当前状态的数据库中的计划指南可以与该查询匹配。 例如,如果 AdventureWorks 是当前数据库并执行下面的查询:

SELECT * FROM Person.Contact

则只有 AdventureWorks 数据库中的计划指南可以与此查询匹配。

但是,如果 AdventureWorks 是当前数据库,并运行下列语句:

USE DB1;
GO
SELECT * FROM Person.Contact;

则只有 DB1 中的计划指南可以与该查询匹配,因为该查询是在 DB1 的上下文中执行的。

计划指南中可以使用有效查询提示的任何组合。 当计划指南与查询匹配时,计划指南中指定的 OPTION 子句将先添加到查询中,然后再进行编译和优化。 如果与计划指南匹配的查询已包含 OPTION 子句,则计划指南中指定的查询提示将替换查询中已存在的查询提示。 但是,对于要与已包含 OPTION 子句的查询相匹配的计划指南,在 sp_create_plan_guide 语句中指定要匹配的查询文本时,必须包含查询的 OPTION 子句。 若要将计划指南中指定的提示添加到查询中已存在的提示中,而不是替换已存在的提示,必须在计划指南的 OPTION 子句中指定原始提示和附加提示。

可创建的计划指南总数仅受可用系统资源的限制。 但是,应尽量少用计划指南,以便只处理用于提高性能或稳定性能的各个查询。 计划指南不应用来影响已部署应用程序的大部分查询负荷。 特别是,应用 USE PLAN 查询提示的计划指南应用目标查询的固定计划。 因此,查询优化器无法再使查询的计划适应统计信息和索引中的更改。

考虑应用使用 USE PLAN 查询的计划指南时,请确保比较应用固定计划的优点与无法使计划随数据分布及可用索引的更改而自动调整的缺点。

建议在将应用程序升级到新版本的 SQL Server 时,重新计算并测试计划指南定义。 性能优化要求和计划指南匹配行为可能会有所更改。

计划指南对计划缓存的影响

对某个模块创建计划指南将从计划缓存中删除该模块的查询计划。 对批处理创建 OBJECT 或 SQL 类型的计划指南将删除具有相同哈希值的批处理的查询计划。 创建 TEMPLATE 类型的计划指南将从该数据库的计划缓存中删除所有单语句批处理。

创建计划指南

禁用、重新启用或删除计划指南

获取有关当前数据库中的计划指南的信息

请参阅

概念

使用计划指南在部署的应用程序中优化查询

其他资源

查询性能

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2007 年 9 月 15 日

更新的内容:
  • 详细阐明了当 @type = 'SQL' 和 @module_or_batch 设置为 NULL 时 statement_text 的计划指南匹配要求。
  • 增加了创建计划指南对计划缓存的影响的有关信息。