查询存储提示最佳做法

适用于: SQL Server 2022 (16.x) Azure SQL 数据库Azure SQL 托管实例

本文详细介绍了使用查询存储提示的最佳做法。 查询存储提示支持在不修改应用程序代码的情况下调整查询计划形状。

查询存储提示的用例

将以下用例视作查询存储提示的理想用例。 有关详细信息,请参阅何时使用查询存储提示

注意

由于 SQL Server 查询优化器通常会为查询选择最佳执行计划,我们建议资深开发人员和数据库管理员仅在不得已时使用提示。 有关详细信息,请参阅查询提示

无法更改代码时

利用查询存储提示,可以影响查询的执行计划,而无需更改应用程序代码或数据库对象。 没有其他功能支持便捷地应用查询提示。

例如,你可以使用查询存储提示来帮助 ETL,而无需重新部署代码。 通过这个 14 分钟的视频了解如何使用查询存储提示改进大容量加载:

查询存储提示是轻量级查询优化方法,但如果查询有问题,应使用重大代码更改来解决。 如果经常发现需要向查询应用查询存储提示,请考虑执行大型查询重写。 SQL Server 查询优化器通常会为查询选择最佳执行计划,我们建议资深开发人员和数据库管理员仅在不得已时使用提示。

有关可应用哪些查询提示的信息,请参阅支持的查询提示

在高事务负载下或使用任务关键型代码

如果由于运行时间要求高或事务负载高,使得代码更改不可能实现,那么查询存储提示可以快速将查询提示应用于现有查询工作负载。 添加和移除查询存储提示非常简单。

可以将查询存储提示添加到批处理查询,以调整异常工作负载突发时段的性能。

作为计划指南的替代方案

在查询存储提示之前,开发人员必须依赖计划指南来完成类似任务,使用起来非常复杂。 查询存储提示与 SQL Server Management Studio (SSMS) 的查询存储功能相集成,用于直观浏览查询。

使用计划指南时,必须使用查询代码片段搜索所有计划。 查询存储提示功能不需要完全匹配的查询来影响生成的查询计划。 查询存储提示可应用于查询存储数据集中的 query_id

查询存储提示会替代硬编码的语句级别提示和现有的计划指南。

考虑较新的兼容性级别

例如,如果由于供应商规范或较大的测试延迟而无法使用较新的数据库兼容性级别,查询存储提示可能是一种好方法。 如果数据库可使用更高的兼容性级别,请考虑升级单个查询的数据库兼容性级别,以利用 SQL Server 的最新性能优化和功能。

例如,如果 SQL Server 2022 (16.x) 实例的数据库兼容级别为 140,则仍可以使用查询存储提示来运行兼容级别为 160 的单个查询。 可以使用以下提示:

EXEC sys.sp_query_store_set_hints @query_id= 39, @query_hints = N'OPTION(USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_160''))';

有关完整教程,请参阅查询存储提示示例

升级后考虑旧的兼容性级别

查询存储提示可以提供帮助的另一种情况是,在 SQL Server 实例迁移或升级后无法直接修改查询。 使用查询存储提示为查询应用先前的兼容性级别,直到可以重写或以其他方式寻址查询,以便在最新的兼容性级别中运行良好。 使用查询存储的回归查询报告、迁移期间使用查询优化顾问工具或其他查询级别应用程序遥测,识别在更高兼容性级别中回归的离群值查询。 有关兼容性级别之间差异的详细信息,请查看兼容性级别之间的差异

在对新的兼容性级别进行性能测试并以这种方式部署查询存储提示后,就可以升级整个数据库的兼容性级别,同时将有问题的关键查询保留在先前的兼容性级别上,而无需更改任何代码。

查询存储提示注意事项

部署查询存储提示时,请考虑以下场景。

数据分发更改

计划指南、通过查询存储的强制计划,以及查询存储提示可替代优化器做决策。 查询存储提示现在可能很有利,但在将来可能不会。 例如,如果查询存储提示在以前的数据分发中对查询起到帮助作用,那么在大规模 DML 操作更改了数据时,可能会适得其反。 新的数据分发可能导致优化器作出比提示更好的决策。 该场景是强制执行计划行为最常见的后果。

定期重新评估查询存储提示策略

在以下情况下重新评估现有查询存储提示策略:

  • 已知大型数据分发更改后。
  • Azure SQL 数据库或托管实例或虚拟机的服务级别目标 (SLO) 发生更改时。
  • 计划修复已经持续了很长时间的情况下。 查询存储提示最适合用于短期修复。
  • 意外的性能回归。

广泛的潜在影响

无论参数集、源应用程序、用户或结果集如何,查询存储提示都会影响查询的所有执行。 对于意外的性能回归,可以使用 sys.sp_query_store_clear_hints 轻松移除使用 sys.sp_query_store_set_hints 创建的查询存储提示。

在生产环境中应用查询存储提示之前,仔细地对任务关键型系统或敏感系统的更改进行负载测试。

强制参数化和 RECOMPILE 提示不受支持

当数据库选项 PARAMETERIZATION 设置为 FORCED 时,不支持同时应用查询存储提示和 RECOMPILE 查询提示。 有关详细信息,请参阅强制参数化使用指南

RECOMPILE 提示与数据库级别的强制参数化集不兼容。 如果数据库具有强制参数化集,并且 RECOMPILE 提示是查询存储中提示字符串集的一部分,则数据库引擎将忽略 RECOMPILE 提示,并将应用其他提示(如果已使用)。 此外,从 2022 年 7 月开始,在 Azure SQL 数据库中,应发出警告(错误代码 12461),指出 RECOMPILE 提示已被忽略。

有关可应用哪些查询提示的信息,请参阅支持的查询提示

另请参阅

后续步骤