首页 > 解决方案 > 将数据库兼容性级别更改为 2008 并返回到 2016 可以提高性能 - 怎么可能?

问题描述

我们的客户报告了一个我无法解释的有趣现象:在他们将数据库兼容性级别从 2016 年更改为 2008 年,然后回到 2016 年,存储过程中使用的函数的性能显着提高 - 从 9 秒到 4 秒。他们不执行具有 2008 兼容性的程序,仅重置兼容性。

我执行了几次该程序,然后翻转了兼容性,并再次使用相同的参数执行了相同的程序 - 它使用相同的计划,但完成得更快。可能是什么原因?这是我用来比较性能及其计划的查询。

查询计划

标签: sql-serverquery-optimizationdatabase-performancecompatibility-level

解决方案


当我们改变一个数据库的兼容级别时,会导致缓存的存储过程计划被移除。例如,当我们在 Adventureworks 数据库中执行以下存储过程时,它会将其插入到计划缓存中。

   EXEC uspGetEmployeeManagers 96

在此处输入图像描述

然后我们将更改数据库的兼容性,此操作将删除缓存的存储过程计划。

ALTER DATABASE AdventureWorks2017 SET COMPATIBILITY_LEVEL= 100

在此处输入图像描述

因此,在更改数据库的兼容级别后,存储过程将使用新的查询计划。使用新的存储过程查询计划可以提高查询性能。


推荐阅读