将数据库兼容性级别从 120 升级到 130 时性能下降

本文可帮助你解决将数据库兼容性级别从 120 升级到 130 时出现的问题。

原始产品版本: Windows 上的 SQL Server 2016、SQL Server 2017(所有版本)
原始 KB 数: 3212023

总结

假设出现了下面这种情景:

  • 通过使用包含函数(例如 STIntersects SQL Server 2016 或 Windows 上的 SQL Server 2017)的筛选器来运行空间查询。
  • 数据库兼容性级别为 120。
  • 查询使用并行执行计划。
  • 将数据库兼容性级别升级到 130,执行计划已从并行更改为串行。

在此方案中,如果查询返回大型结果集,则性能会降低。

解决方法

若要解决此问题,请尝试以下方法之一:

  • 将数据库兼容性级别还原为 120。 执行此操作时,将无法从 SQL Server 2016 或 Windows 上的 SQL Server 2017(数据库兼容性级别为 130)中提供的一些功能中受益。 但是,你仍能够实现许多未绑定到数据库兼容性级别的改进,例如,对具有空间数据类型的查询操作的总体性能改进。

    有关需要数据库兼容性级别 130 的 SQL Server 2016 增强功能的列表,请参阅 ALTER DATABASE (Transact-SQL) 兼容性级别

  • 如果计划提供更好的性能,则强制使用数据库兼容性级别 120 生成的计划。 可以使用查询提示通过数据库兼容性级别 130 USE PLAN 运行时强制此计划。 有关使用提示的详细信息,请参阅 提示 (Transact-SQL) - 查询

    或者,使用查询存储来识别和修复特定的计划选择。 有关为此使用查询存储的详细信息,请参阅查询存储使用方案

详细信息

SQL Server 数据库兼容性级别 120 和 130 使用不同的方法来估算谓词的基数,其中标量用户定义函数或特定的 T-SQL 函数(如 STIntersects)与常量进行比较。

尽管与级别 120 相比,数据库兼容性级别 130 使用的成本模型为许多工作负荷生成性能提升,但对于某些查询(具体取决于所使用的数据和函数),查询计划的性能实际上可能在级别 130 下降。

适用于

  • Windows 上的 SQL Server 2017(所有版本)
  • SQL Server 2016 Service Pack 1
  • SQL Server 2016 Developer
  • SQL Server 2016 Enterprise
  • SQL Server 2016 Express
  • SQL Server 2016 Standard
  • SQL Server 2016 Web