在我们的生产环境中,我们有几个服务器使用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,它将运行得非常快。
我搜索了很多关于这个问题,但没有找到任何东西。
SQL Server 2014
引入新的基数估计器
SQL Server 2014的性能改进之一是重新设计了基数估计。进行基数估计(CE)的组件称为基数估计器。生成查询计划是SQL查询处理器的重要组成部分。基数估计是对中间结果(如连接、过滤和聚合)的最终行计数和行计数的预测。这些估计对计划的选择有直接的影响,比如连接顺序、连接类型等。在SQL Server 2014之前,基数估计器主要基于SQL Server 7.0代码库。SQL Server 2014引入了新的设计,新的基数估计器是基于对现代工作负载的研究和从过去的经验中学习。
跟踪标志9481
和2312
可用于控制使用哪个版本的基数估计器。
检查导致问题的查询并比较执行计划属性估计行数与实际行数值在2008年和2014年。
Microsoft SQL Server 2014的基数估计
从SQL Server 2016+
可以设置每个数据库的旧基数估计器,而不使用traceflags或将DB兼容性级别更改为110。
ALTER DATABASE scope CONFIGURATION
该语句允许在单个数据库级别配置许多数据库配置设置,独立于任何其他数据库的这些设置。LEGACY_CARDINALITY_ESTIMATION = {ON | OFF | PRIMARY}
使您能够将查询优化器基数估计模型设置为
SQL Server 2012
或更早的版本,而与数据库的兼容性级别无关。这相当于Trace Flag 9481
。若要在实例级别设置此属性,请参见跟踪标志(Transact-SQL)。要在查询级别完成此操作,请添加QUERYTRACEON
查询提示。设置查询优化器的基数估计模型为SQL Server 2012及更早版本的基数估计模型。
了根据数据库的兼容性级别设置查询优化器基数估计模型。
ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON;