数据库
首页 > 数据库> > 解决SQL Server因升级后改采新型的基数估计(Cardinality Estimation)而导致的性能问题

解决SQL Server因升级后改采新型的基数估计(Cardinality Estimation)而导致的性能问题

作者:互联网

最近由于SQL2008R2即将EOS,所以陆陆续续将数据库升级到SQL2017的版本。而升级完成后有部分功能居然查询时间太久导致Web TimeOut,经一番查询后发现是新版SQL Server已在SQL2014采用新的基数估计(Cardinality Estimation简称CE)。而某些查询会因为采用新版CE来估计统计反而误用性能不好的执行计划,官网分析有下列特性的查询就可能发生查询变慢的状况。


既然是新版CE造成的性能问题,那是不是有合适的解决方案来解决这样的问题呢? 下列是微软提供解决的几种解决方式。

  1. 调低数据库相容性层级,只要将相容性层级调降到110(含)以下,SQL就会改采旧版的CE来运行。

  2. 直接设定数据库采用旧版CE。

  3. 在有性能问题的Query中加入Option Hint,强制该Query采用旧版CE。

  4. 利用SQL2016新功能Query Store,来强制指定Query的执行计划。

下面这句语法是我实际遇到因CE问题而导致性能变差,由下图红色圈选处可以看见Tempdb有大量的IO(workfile有3336个Page读取),整个执行耗时也需要4秒半左右。

接下来我们采用第一种方式,调降数据库相容性层级到100,让数据库会自动采用旧的CE来产出执行计划。由下图可以看出当我们调降相容性层级到100后,该查询在workfile没有任何的逻辑读取,且执行耗时只要272ms。

接下来我们采用第二种方式,直接设定数据库采用旧版CE来产出执行计划。由下图可以看出当我们设定数据库采用旧版CE后,该查询在workfile也没有任何的逻辑读取,且执行耗时只要252ms。

第三种方式我们在该Query加入Option(Querytraceon 9481)让该句查询采用旧版CE(下图蓝色圈选处),其结果也是workfile也没有任何的逻辑读取,且执行耗时只要291ms
SQL2017后该Query的Hint可改为OPTION (USE HINT ('FORCE_LEGACY_CARDINALITY_ESTIMATION'))这样。

上述的第一及第二种方式都要牺牲数据库无法采用新版CE的优点,这两个方式的解决方法最快,但须在新旧间取舍。而第三种方式就得改到Code,因此也需要付出相对成本。

第四种方式则是利用Query Store的功能针对该句语法在不同相容性层级产出不同执行计划后,强制指定该Query用性能较好的执行计划,作法如下。
我们调降数据库相容性层级到100,然后开启该数据库Query Store的功能,开启后我直接执行该句Query,如下图所示。

如下图所示,我们来开启Query Store的图表。

我们可以在该图表左上长条图中找到该句语法,找到后点选该长条图,然后右上图表中的点点(方案识别码为1)就是这句语法相对的执行计划。

接下来我将相容性层级调回到130后,再次执行该语法,如下图所示。

然后我们更新刚刚那张图表会发现该Query又产生了另一个执行计划,两个执行计划的执行所需耗时可以直接在该图表看见,方案识别码1(约300ms内)比方案识别码10(需4秒多)好很多

接下来我就点选方案识别码1的圈圈后再去点选 [强制执行计划],这样一来日后只要执行该Query就会直接跳过SQL的最佳化引擎而直接用我们刚刚强制指定的执行计划来捞取数据。

完成上述设定后,我们可以在相容性层级130且没开启数据库采用旧CE这功能的状况下解掉刚刚因新CE导致查询性能不佳的状况(workfile没有任何的逻辑读取,且执行耗时只要146ms)。

好友Alexis有提到微软建议升级后先不要调升相容性层级,而是先开启Query Store功能,等到AP所有功能测试过一轮再调高相容性层级。调高后如遇到因为升级而导致的性能问题的语法,就可以马上用指定强制执行计划的方式来解决。但这样一来就等于跳过SQL最佳化引擎,且日后升级或搬移数据库到别台主机,其相同的状况又会浮现。

我近期遇到会因为新旧CE而造成性能问题的情况都是因为语法执行过程中有隐含转换,例如varchar跟nvarchar做join或是查询的Where两边数据型态不一样导致。修正掉这些原因后都可以让性能恢复,只是不知道以前同样情境为何在旧CE模式下不会有性能缓慢的问题。因此找出问题解决根本的原因才是王道,上述做法应该仅适用解决燃眉之急吧。

相关连结 : 基数估计 (SQL Server)    使用查询存放区监视性能    使用查询存放区的最佳作法

我是ROCK

rockchang@mails.fju.edu.tw

原文:大专栏  解决SQL Server因升级后改采新型的基数估计(Cardinality Estimation)而导致的性能问题




标签:执行,数据库,CE,Server,层级,改采,相容性,Query,Estimation
来源: https://www.cnblogs.com/petewell/p/11465468.html