开始使用查询优化助手 (QTA)
你计划将两个生产数据库从 SQL Server 2012 迁移到新的 SQL Server 2022 实例。 由于数据库正在使用中,因此你最初希望在原始设置中保留兼容性级别并重新指向应用程序。 基数估算器自 SQL Server 2014 以来已更改,并且你希望在将数据库的兼容性级别更改为 SQL Server 2022 (160) 之前衡量查询性能。
你需要在移动了兼容性级别并应用了新的基数估算器算法后,找出并修复任何性能下降的查询。 使用此方法衡量升级兼容性级别后要针对其进行比较的性能基线。
启用查询存储会收集查找回归查询所需的指标,使用查询优化助手 (QTA) 会指导你修复回归查询。 本单元概述了查询存储和 QTA。
查询存储概述
SQL Server 2016 中引入了查询存储功能,用于持续收集有关数据库中查询执行和性能的信息。 查询存储的工作方式类似于飞行数据记录器,用于收集有关查询和计划的运行时信息。 如果保存此运行时数据,可随时间推移跟踪性能。 如果出现问题,通过信息的历史记录可发现问题原因。
从 SQL Server 2022 开始,在 Azure SQL 数据库和 SQL 托管实例中,默认对新数据库启用查询存储。 在 SQL Server 2016、SQL Server 2017 和 SQL Server 2019 中,默认未启用查询存储,但 SQL Server 2016 或更高版本实例上的任何数据库都可启用、禁用并配置查询存储。 有关如何在数据库上启用查询存储或确认其配置的说明,请参阅下一单元。
查询存储可在兼容性级别低于 SQL Server 实例的数据库上工作。 例如,如果将数据库从 SQL Server 2012 迁移到 SQL Server 2022,并将兼容级别保持在 110,则查询存储仍然可以在数据库上运行。
但是,智能查询处理的许多功能和其他自动性能改进仅针对较新的数据库兼容性级别启用。 因此,应尝试在最新的 SQL Server 数据库兼容性级别上测试应用程序性能。 查询存储和 QTA 可帮助进行此性能测试。
在数据库上启用后,查询存储收集和报告查询的以下统计信息:
- 退化的查询
- 总体资源消耗
- 资源消耗量最大的几个查询
- 具有强制计划的查询
- 变化程度高的查询
- 查询等待统计信息
- 跟踪的查询
当查询优化器使用导致性能下降的新查询计划时,就会出现回归查询。 在添加、删除或更改索引、更新统计信息或更改数据基数等重要更改后,可能会发生回归。
在查询存储出现之前,SQL Server 未提供回归原因的见解,并且识别问题对数据库开发人员和管理员来说是个问题。 现在,可使用查询存储查找回归查询并强制优化器使用历史中的特定计划。
数千个查询中的少数查询消耗大部分系统资源是很常见的。 查询存储可确定哪些查询的消耗量最高,无论是由于退化还是优化不佳所致。 根据配置,可按持续时间、CPU、内存、I/O 或执行次数筛选结果。
可使用查询存储监视持续的性能,并将其用于 A/B 测试以比较应用单个更改前后的性能。 例如,可通过向查询引用的表添加索引来优化查询,使联接查找速度更快。 比较添加索引前后查询存储中的统计信息可了解索引是否会影响性能。 还可以在添加新硬件或更新应用程序后比较统计信息。
查询优化助手概述
查询优化助手 (QTA) 使用查询存储中的数据来查找开始退化的查询。 QTA 自动进行试验以寻找解决方案,该解决方案在查询性能下降到影响用户之前提升查询性能。
升级后,可使用查询存储和 QTA 监视和优化数据库性能。 将数据库迁移到 SQL Server 2016 或更高版本后,保持数据库的兼容级别不变,然后启用查询存储以收集基线查询性能统计信息。
然后,更改兼容性级别,并继续使用查询存储数据来衡量查询的性能统计信息。 可比较统计信息,以确定每个查询的性能与升级前相比是更好、相同还是更差。
为升级数据库而更改兼容级别后,SQL Server 更改所使用的基数估算器的版本。 QTA 找出由于基数估算器更改而导致的查询回归的模式,并进行试验来寻求性能改进方法。 然后,可为性能提升了的查询创建计划指南。
总结
查询存储持续测量查询的性能统计数据,就像飞机的飞行数据记录器捕获活动一样。 可对 SQL Server 2016 或更高版本上的任何数据库(无论兼容级别如何)启用查询存储。 使用查询存储来持续监视查询性能,并将其用于 A/B 测试以衡量单个更改的影响。
将数据库升级到 SQL Server 2014 或更高版本时,对基数估算器的更改可能会降低查询速度,而这些查询在早期 SQL Server 版本中速度较快。 理想情况下,你希望在影响用户之前查找并修复任何回归。 对数据库启用查询存储意味着该功能会持续收集查询的统计信息。 然后,可使用 QTA 在回归查询成为问题之前识别并修复它们。