SQL Server 2022 升级:修复 SQL 2016 的性能下降问题

Avilas

最近从 SQL Server 2016 SP3 迁移到 SQL Server 2022 CU16 带来了重大的性能挑战。此详细分析探讨了从新的查询优化器和操作系统到特定代码模式的根本原因,并提供了清晰的优化路径。

SQL Server 2022性能下降分析| GigXP.com

GigXP.com

发表于 2025 年 8 月 5 日,作者:GigXP 团队

最近从 SQL Server 2016 SP3 迁移到 SQL Server 2022 CU16 给我们的客户带来了重大的性能挑战。尽管日志传送迁移执行得很好,并且做出了保留 2012 年兼容模式的战略决策,但工作时间内的平均 CPU 利用率仍从 30% 增加到 50%。一个关键的观察结果是,许多查询在保留相同的执行计划形状的同时,现在的执行时间明显更长。此详细分析探讨了从新的查询优化器和操作系统到特定代码模式的根本原因,并提供了清晰的优化路径。

性能转变

旧CPU
30%

新CPU
50%

有关的:SQL Server Express 性能指南:扩展 CPU 和调整

CPU 增加 66%

查询延迟

旧查询时间
6毫秒

新查询时间
50毫秒

速度慢约 8 倍

迁移比较摘要

特征 旧 SQL 2016 服务器 新的 SQL 2022 服务器
操作系统 Windows 服务器 2016 Windows Server 2025 数据中心
SQL Server 版本 2016 年,服务包 3 2022年,累计更新16
兼容模式 大多数数据库为 2012 年 相同,大多数数据库为 2012 年
主机和核心 AWS Z1D.12XLarge,48 个逻辑核心 相同,AWS Z1D.12XLarge,48 个逻辑核心
临时数据库 RAM 磁盘上有 24 个文件 NVMe磁盘上有24个文件
平均CPU 峰值时 30% 峰值时 50%

交互式性能指标

选择下面的指标以查看其基于我们分析的模拟趋势。

CPU利用率
锁定等待时间

详细分析:“沉默的破坏者”

核心问题是一个悖论:执行计划看起来很稳定,但查询运行速度却很慢。这表明 SQL Server 2022 引擎本身发生了微妙的、根本性的变化。新的基数估计器 (CE)即使在兼容模式 2012 中,也可能影响运行时决策,导致内存授予不理想并增加 I/O。

关于临时表的注释

观察到的使用临时表的存储过程的高重新编译率是一个关键症状。虽然 SQL Server 2022 增强了临时表缓存,但这种行为表明现有代码可能违反了有效缓存的规则(例如,显式删除表或更改架构),而新引擎对此更敏感。

此外,使用新的Windows Server 2025是一种无法量化的风险。操作系统的内核和内存管理会对 SQL Server 的性能产生深远的影响,而且这个新平台可能没有针对 SQL Server 2022 工作负载进行完全优化,可能会导致内存分配和 CPU 调度效率低下。

深入探讨:根本原因分析

性能下降不是单一问题,而是与新的 SQL Server 2022 引擎和操作系统相关的多种因素的组合。

查询优化器和基数估计器行为

SQL Server 2022 的一个关键部分是新的基数估计器 (CE160)。即使在兼容模式 2012(级别 110)下,底层 SQL Server 引擎仍然会受到其本机 CE 的影响,从而导致对中间结果集的估计不同,有时甚至不太准确。这可能会导致:

  • 查询的内存授予次优。
  • 即使具有相同的计划形状,连接顺序也效率低下。
  • 由于行估计不准确而导致 I/O 操作增加。

这就是“相同的计划,执行速度较慢”的悖论,计划看起来相同,但内部执行效率较低,直接导致CPU使用率更高、查询时间更长。

TempDB 配置以及 NVMe 与 RAM 磁盘

理论上,将 TempDB 从 RAM 磁盘迁移到高速 NVMe 磁盘应该会提高性能。 RAM 磁盘可能会导致“双 RAM 缓存”,从而减少 SQL Server 缓冲池的可用内存。 NVMe磁盘消除了这个问题,并提供了出色的I/O性能。

不过,SQL Server 2022 还增强了 TempDB 缓存和无闩锁分配。临时表查询的重新编译次数“增加”,这一事实表明现有代码没有正确利用这些新功能,可能是因为违反了临时表缓存规则,例如显式删除表或更改架构。此行为可能会压垮改进的 TempDB 子系统。

Windows Server 2025:前沿风险

新环境在最新的 Windows Server 2025 上运行。这是一个关键的、未量化的变量。 SQL Server 2022 和这个新操作系统之间的交互没有详细记录,可能是性能问题的根源。外部报告指出,较新的 Windows Server 版本也出现类似的缓慢情况,通常与内存分配 (MEMORY_ALLOCATION_EXT) 和 CPU 调度效率低下 (SOS_SCHEDULER_YIELD) 有关。

深入探讨:临时表重新编译

使用临时表的存储过程的高重新编译率是一个关键症状,也是导致 CPU 增加的直接原因。每次重新编译都会消耗 CPU 并增加延迟。

为什么会发生这种情况

SQL Server 2022 增强了临时表缓存以防止重新编译。然而,这种缓存机制对某些编码模式很敏感。如果存储过程是:

  • 对临时表显式使用“DROP TABLE”语句。
  • 在初始创建后更改临时表的架构(例如,在单独的语句中添加索引)。

新引擎可能对这些违规更加敏感,每次运行过程时都会触发重新编译,而 SQL Server 2016 上的情况并非如此。转换为表变量的客户端测试是一种有效的解决方法,因为表变量不受这些相同的重新编译触发器的影响。

监控指标和等待统计分析

监控仪表板揭示了提供性能下降直接证据的关键指标。下表总结了最关键的观察结果。

指标名称 观测值(峰值/平均值) 解释/意义
CPU 利用率 – 总体 50%(平均)、80-90%(峰值核心) 较30%大幅增加,表明CPU压力较高。
批量请求/秒 ~7.5K(峰值) 与旧服务器一致,工作负载量不是原因。
锁定等待时间 >2.5K(峰值) 发生严重阻塞,查询等待锁。
锁存器等待/秒 >9K(峰值) SQL Server 内部内存结构存在高度争用。
可用内存 ~35-40K MB 操作系统有可用内存,但 SQL Server 可能存在内部分配问题。
缓冲区高速缓存命中率 ~99%(平均) 良好的数据缓存,但没有考虑 TempDB 或其他内存压力。

最关键的指标是峰值锁定等待时间锁存器等待/秒。锁定等待时间图显示查询经常被阻塞,这直接导致其执行时间更长。高闩锁等待表明 SQL Server 内部内存结构存在争用,这表明底层引擎在负载增加的情况下正在努力管理资源。这种等待与 CPU 增加的结合强烈表明了一系列问题,其中查询执行效率较低(由新的 CE 和操作系统引起)导致资源争用增加。

建议和后续步骤

您可以展开此部分以查看可操作步骤的详细列表。

显示推荐

立即排除故障

  • 验证和调整 TempDB 配置:确保 TempDB 文件大小正确,并且 NVMe 磁盘上不存在底层 I/O 瓶颈。
  • 调查临时表重新编译:检查有问题的存储过程以查找“DROP TABLE”语句或架构更改。
  • 监视特定等待类型:使用“sys.dm_os_wait_stats”主动查找“MEMORY_ALLOCATION_EXT”和“SOS_SCHEDULER_YIELD”等待。

长期战略

  • 分析执行计划:使用“SET STATISTICS XML ON”来比较实际计划并查找基数估计问题。
  • 测试“LEGACY_CARDINALITY_ESTIMATION”:尝试显式强制旧版 CE 以查看有问题的查询的性能是否有所提高。
  • 计划逐步升级:制定分阶段计划以升级到更高的兼容性级别,以利用新的 IQP 功能。

相关主题

© 2025 GigXP.com。版权所有。