SQL Server 2014 - 一些查询非常慢(基数估算器)

时间:2015-08-21 10:49:41

标签: sql sql-server tsql sql-server-2014

在我们的生产环境中,我们有几台服务器SQL server 2012 SP2+Windows Server 2008R2。 3个月前,我们将所有服务器迁移到SQL Server 2014 SP1+Windows Server 2012 R1。我们使用新配置(更多RAM,更多CPU,更多磁盘空间)创建了新服务器,并从SQL Server 2012 - >备份我们的数据库。还原到新的SQL Server 2014服务器。恢复后,我们将兼容级别从110更改为120 +重建索引+更新统计信息。

但是现在我们遇到了几个在兼容级别为120时运行速度很慢的查询的问题。如果我们将兼容级别更改为旧的110,它运行得非常快。

我搜索了很多关于这个问题,但没有找到任何东西。

1 个答案:

答案 0 :(得分:4)

SQL Server 2014介绍new cardinality estimator

  

SQL Server 2014的性能改进之一是重新设计基数估算。进行基数估计(CE)的组件称为基数估计器。它是查询计划生成的SQL查询处理器的基本组件。基数估计是对最终行数和中间结果的行计数(例如连接,过滤和聚合)的预测。这些估计值对计划选择有直接影响,例如连接顺序,连接类型等。在SQL Server 2014之前,基数估算器主要基于SQL Server 7.0代码库。 SQL Server 2014引入了新的设计,新的基数估算器基于对现代工作负载的研究和对过去经验的学习。

跟踪标记94812312可用于控制使用哪个版本的基数估算器。

在2008年和2014年检查导致问题的查询并比较执行计划属性估计行数实际行数值。

Cardinality Estimates in Microsoft SQL Server 2014

SQL Server 2016+开始,您可以为每个数据库设置旧的基数估算器,而不使用跟踪标志或将数据库兼容级别更改为110.

<强> ALTER DATABASE SCOPED CONFIGURATION

  

此语句允许在单个数据库级别配置多个数据库配置设置,独立于任何其他数据库的这些设置。

     

LEGACY_CARDINALITY_ESTIMATION = {ON |关闭|主要}

     

使您能够将查询优化器基数估计模型设置为SQL Server 2012及更早版本,而与数据库的兼容级别无关。这相当于Trace Flag 9481。要在实例级别设置此项,请参阅跟踪标志(Transact-SQL)。要在查询级别完成此操作,请添加QUERYTRACEON查询提示。

     

打开

     

将查询优化器基数估算模型设置为SQL Server 2012及更早版本的基数估算模型。

     

关闭

     

根据数据库的兼容级别设置查询优化器基数估算模型。

ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON;