本文可帮助你解决将数据库兼容性级别从 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