了解计划强制

USE PLAN 查询提示可用于强制查询优化器对查询使用指定的查询计划。USE PLAN 查询提示通过接受希望以 XML 格式用作参数的查询计划发挥作用。USE PLAN 可用于其计划导致执行变慢但您知道还存在更好的计划的那些查询。有一种常见的情况是,在早期版本的 SQL Server 中有效执行的查询,在升级后的版本中执行状况不好,不管此升级是 Service Pack 还是完整的版本升级。大多数情况下,升级后,在多数查询执行时间内,查询性能与以前相同或比以前要好;但可能也有例外。可以使用 USE PLAN 查询提示处理这些情况:在早期产品版本中查询优化器选择的查询计划优先于升级后选择的查询计划。

解决部署的应用程序中查询性能较差的问题时,可以将 USE PLAN 查询提示与计划指南结合使用。如果您不能或不希望直接更改应用程序,可使用计划指南将查询提示应用于查询。有关计划指南的详细信息,请参阅使用计划指南在部署的应用程序中优化查询。有关说明如何在计划指南中应用 USE PLAN 查询提示的详细情况,请参阅计划强制方案:创建用于指定查询计划的计划指南强制实施计划方案:创建计划指南以强制实施从重写查询获得的计划

计划强制可用于多数类型的查询,包括对表、聚集索引和非聚集索引、索引视图以及已分区表和索引的查询。可以使用数据操作语言 (DML) 语句 INSERT、UPDATE、MERGE 或 DELETE 来指定 USE PLAN。注意,数据库架构的更改(例如添加或删除索引)可能会使 USE PLAN 提示中所指定的计划无效。如果直接在查询中指定 USE PLAN,无效的计划将导致查询失败。如果在计划指南中指定 USE PLAN,无效的计划不会导致查询失败;但是,计划编译时不会使用提示,所以它可能不是最好的选择。如果 USE PLAN 提示在计划指南中使用,您可以使用 sys.fn_validate_plan_guide 函数来验证计划的有效性。基于此函数的结果,您可能会决定删除该计划指南并重新调整查询或者修改数据库设计。例如,可以重新创建计划指南中指定的索引。

使用 USE PLAN 查询提示生成的查询计划的缓存方式和其他查询计划的缓存方式完全一样。

计划强制的限制

计划强制限制只对查询使用单个的静态执行计划。计划强制使得查询优化器不再适于更改数据大小和数据分布、新索引以及其他变量。因此,如果错用计划强制,可能会导致出现性能问题。只有在充分使用了用于提高查询性能的其他方法(例如使用最新的精确统计信息和优化的索引)后,才可以使用计划强制。应谨慎使用计划强制,并且应仅由经验丰富的数据库管理员和开发人员(他们非常了解性能问题及变化的数据库和应用程序环境)使用。

使用 USE PLAN 查询提示影响在已部署的应用程序中编译查询时,应在计划指南中使用提示,而不是直接在应用程序中嵌入提示。这样,可以解决下列问题:

  • 可以在不修改或重新编译应用程序的情况下更改或删除提示。少数情况下,在某一版本的 SQL Server 中应用的 USE PLAN 提示可能无法应用于以后的 Service Pack 或发行版本中。因此,可能需要在部署了应用程序后更改或删除 USE PLAN 提示。

  • 可以避免直接在查询中使用大型提示。这样,查询就更容易进行读取。

    重要说明重要提示

    创建使用 USE PLAN 的计划指南时,应该在测试过程中验证,您希望强制执行其计划的查询是否通常使用游标请求提交。基于游标的查询的查询计划不同于那些非游标查询的查询计划。因此,计划指南必须指定游标计划,才能创建指定 USE PLAN 提示(应用于使用游标请求提交的查询)的计划指南。有关详细信息,请参阅对包含游标的查询使用 USE PLAN 查询提示

下列类型的查询不支持计划强制: