通过设置兼容性级别打开 2014 功能时,MS SQL Server CPU 负载急剧上升

Spa*_*aer 4 performance sql-server sql-server-2014

我正在一台规格合理的机器上运行一些 Microsoft SQL Server 2014 负载测试。我当然不是 SQL Server 调优细节方面的专家,但根据我从各个地方收集的一些片段,我认为设置非常好。

表演中的一个元素确实令人困惑,因此我在这里伸出援手。我正在测试的数据库是历史上建立的,最初是针对 2008r2 创建的。兼容性设置是从那个版本继承过来的。上周我分两个阶段提高了该设置,但是当我将其从 2012 年提高到 2014 年的兼容性时,突然间 CPU 负载飙升。

当来回更改此设置时,它似乎是系统性的。我可以使用 2012 设置在 8 核数据库上运行 X 个模拟用户(数据库前面的 Web 应用程序)。如果我将其提高到 2014 年,我只能逃脱 60% 的 X 个模拟用户。反之,对于 X 用户,2014 年设置的批量请求数降低了 40%。

据我了解,切换回兼容性级别不会恢复数据库,而只会关闭功能。这种情况似乎表明一个功能在没有明显增益的情况下消耗 CPU,所以我想知道可能是哪个功能以及是否有办法单独打开该特定功能?

serverfault 上的其他帖子指出升级后重建索引,我已经这样做了,但这似乎并没有真正产生影响。

需要注意的是,手头的应用程序会生成许多不是准备好的语句的查询。这可能导致我在 perfmon 中看到大量编译(编译/批处理请求:0.25)。我对此无能为力,所以告诉我先做些什么并不能真正帮助我前进。

Tom*_*m V 8

我怀疑新的基数估计器是造成这种行为的原因,您可以在 msdn 文章中阅读它

明确指出,当您将数据库置于新的兼容模式时,新的基数估计器生效。

升级所有现有数据库以使用新的基数估计器。为此,请使用 ALTER DATABASE 兼容级别 (Transact-SQL) 将数据库兼容级别设置为 120 或更高。

存在控制此行为的跟踪标志。如果要在数据库处于旧兼容模式时使用新基数估计器,可以启用跟踪标志 2312 如果要在数据库处于新兼容模式时使用旧基数估计器,可以启用跟踪标志 9481

如果您可以隔离有问题的查询,您可以尝试对其进行调整,使其在新的基数估计器中表现良好,或者如果这不起作用,您可以QUERYTRACEON仅在该查询上使用关键字。这也记录在 msdn 链接中。

另请注意,在设置跟踪标志时,您可能需要使用DBCC TRACEON (<traceflag>,-1)-1 全局设置的位置。