SQL Server 2014 Optimizer索引选择性

时间:2015-05-12 07:20:06

标签: sql-server

我发现SQL Server 2012和SQL Server 2014对SQL Server 2014的相同查询和执行计划使用不同的非聚集索引很糟糕。

我尝试使用fullscan更新所有相关表和所有索引,甚至关闭旧计划,但是SQL Server 2014没有使用与SQL Server 2012相同的索引。

是否有人也遇到过这个问题?

2012年和2014年的优化器如何决定索引选择性?

2 个答案:

答案 0 :(得分:1)

SQL Server 2014使用新的基数估算器,有时会导致错误的计划。

这基本上是SQL Server对猜测"的一种新方式。计划中的每个操作员将返回多少行。

您可以通过在查询中附加OPTION (QUERYTRACEON 9481)来禁用特定查询(如果估算导致错误的计划)。

您可以通过将兼容性级别设置为低于120的值来禁用服务器范围:

ALTER DATABASE AdventureWorks2012 SET COMPATIBILITY_LEVEL = 110;

您也可以重写查询,以便新的基数估算器实际上比旧估算器更好。

有很多关于新基数估算器的信息,我会花点时间阅读其中的一些。这是一个好的开始: http://sqlperformance.com/2013/12/t-sql-queries/a-first-look-at-the-new-sql-server-cardinality-estimator

答案 1 :(得分:0)

查询优化器是非常复杂的软件,您可以根据自己的时间对此进行研究,根据资源最有效的数据路径计算执行计划,然后执行最有效的计划。但是,总之。

首先,SQL Server 2014中的基数估算器已经过重新设计,因此,与SQL Server 2012上执行的查询计划相比,SQL Server 2014中选择的查询计划可能更加优化,因为两个平台上的表的基础架构设计是相同的。

如果您可以将查询与所有各种表架构定义一起发布,以确切了解您正在使用的内容,将会有所帮助。

Here是SQL Server 2014基数估算的链接

希望这有帮助