SQL Server 2014 优化器索引选择性

Posted

技术标签:

【中文标题】SQL Server 2014 优化器索引选择性【英文标题】:SQL Server 2014 Optimizer index selectivity 【发布时间】:2015-05-12 07:20:05 【问题描述】:

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

我尝试使用全扫描更新所有相关表和所有索引,甚至取消旧计划,但是 SQL Server 2014 未使用与 SQL Server 2012 相同的索引。

有人也遇到过这个问题吗?

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

【问题讨论】:

你可以强制2014使用一些索引。搜索这个。 【参考方案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

【讨论】:

【参考方案2】:

查询优化器是高度复杂的软件,您最好自己研究一下,它们会根据资源最有效的数据路径计算执行计划,然后执行最有效的计划.然而,简而言之。

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

如果您可以发布您的查询以及所有各种表架构定义以准确查看您正在使用的内容,这将有所帮助。

Here 是指向 SQL Server 2014 的基数估计的链接

希望对你有帮助

【讨论】:

以上是关于SQL Server 2014 优化器索引选择性的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 查询优化器运行方式

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

sql server 统计信息

SQL Server 索引优化-----数据库引擎优化顾问

SQL Server查询优化和事务处理

SQL -- SQL Server 查询优化器(Query Optimizers)