在我们的生产环境中,我们有几台服务器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,它运行得非常快。
我搜索了很多关于这个问题,但没有找到任何东西。
答案 0 :(得分:4)
SQL Server 2014
介绍new cardinality estimator
SQL Server 2014的性能改进之一是重新设计基数估算。进行基数估计(CE)的组件称为基数估计器。它是查询计划生成的SQL查询处理器的基本组件。基数估计是对最终行数和中间结果的行计数(例如连接,过滤和聚合)的预测。这些估计值对计划选择有直接影响,例如连接顺序,连接类型等。在SQL Server 2014之前,基数估算器主要基于SQL Server 7.0代码库。 SQL Server 2014引入了新的设计,新的基数估算器基于对现代工作负载的研究和对过去经验的学习。
跟踪标记9481
和2312
可用于控制使用哪个版本的基数估算器。
在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;