确定查询优化助手 (QTA) 是否适合你
了解升级数据库版本后可能会导致的查询计划退化和性能损失。 为了帮助在数据库升级后保持性能,需要找到识别和缓解退化的查询的最佳方法。 本单元介绍如何使用查询存储和查询优化助手 (QTA) 来帮助确保在升级后不会出现性能降低的问题。
开始使用查询存储和查询优化助手
QTA 依赖于查询存储数据来查找在升级后退化的查询。 使用查询存储可在升级之前收集旧数据库版本的指标。
SQL Server 2016 中引入了查询存储,SQL Server 2017 中引入了 QTA。 在 SQL Server 2022 实例上运行的任何数据库版本都可以使用这两项功能。 两种工具都集成到了 SQL Server Management Studio (SSMS) 中,并在数据库级别运作。
数据库的兼容级别决定了其版本,而版本又决定了其使用的基数估算器。 基数估算器会预测查询可能返回的行数,因此查询优化器可以选择成本最低的计划。 SQL Server 2014 引入了升级的基数估算器算法,这不仅有利于大多数查询,而且很少产生负面性能影响。
为了衡量性能影响,查询存储会报告退化到查询和使用最多系统资源的查询。 QTA 会比较数据库升级前后查询存储查询性能数据,并对查询进行试验以提高性能。
注意
QTA 不适用于Azure SQL 数据库或 SQL 托管实例数据库。 对于这些数据库,请考虑使用适用于 Azure Data Studio 的 Azure SQL 迁移扩展。
QTA 和自动计划更正
当 SQL Serve 运行 Transact-SQL (T-SQL) 查询时,它会分析可执行该查询的计划。 SQL Server 会缓存已成功执行的查询的计划,并在再次执行该查询时重复使用这些计划。
SQL Server 为查询选择最佳计划,并一直使用该计划,直到环境迫使其选择一个新计划为止。 这些情况可能包括数据库引擎重新编译计划、添加或移除索引,或更改统计信息。
新计划并非总是优于旧计划。 可以运行以下命令来查找具有退化的计划的查询。
SELECT * FROM sys.dm_db_tuning_recommendations
然后,可以使用 sp_force_plan
存储过程强制 SQL Server 使用推荐的特定计划。
EXEC sp_force_plan @query_id = 1187, @plan_id = 1975
如果在已升级的数据库上许多查询都在退化,那么 sp_force_plan
过程可能会演变成一个很枯燥的手动过程。 SQL Server 2017 引入了一项名为“自动计划更正”的新功能,用于自动优化查询,并且不需要手动干预。 可以通过运行以下语句对数据库启用自动计划更正:
ALTER DATABASE <database-name> SET AUTOMATIC_TUNING (FORCE_LAST_GOOD_PLAN = ON)
设置为数据库级别时,自动计划更正会指示 SQL Server 使用上一个性能正常的查询计划。 SQL Server 会继续监视计划以在执行计划时查找退化情况,并确保其提供最佳性能。
自动计划更正的工作方式与 QTA 不同。 使用上一个性能正常的计划可能意味着回滚到较早的基数估算器。 相反,QTA 使用映射到目标数据库兼容性级别的基数估算器版本来完成试验。
总结
QTA 在 SQL Server 2022 中可用,并根据查询存储进行操作。 QTA 必须具有处于之前兼容性级别的数据库的查询存储基线数据,以便能够在升级之后观察查询并进行比较。
SQL Server 2017 中引入了自动计划更正,使用它无需手动识别和强制执行查询计划。 可在数据库级别启用自动计划更正,但可能会回滚基数估算器的版本。 QTA 使用映射到目标兼容性级别的基数估算器版本。