我发现SQL Server 2012和SQL Server 2014对相同的查询和执行计划使用了不同的非聚集索引。
我尝试使用fullscan更新所有相关表和所有索引,甚至启动了旧计划,但是SQL Server 2014使用的索引与SQL Server 2012不同。
有没有人也遇到过这个问题?
2012和2014上的优化器是如何决定索引选择性的?
发布于 2015-05-12 16:25:05
SQL Server 2014使用新的基数估计器,这有时会导致糟糕的计划。
这基本上是SQL Server“猜测”计划中每个运算符将返回多少行的新方法。
您可以通过将OPTION (QUERYTRACEON 9481)附加到查询来在特定查询上禁用它(如果评估导致了错误的计划)。
您可以通过将compability设置为低于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
发布于 2015-05-12 16:50:52
查询优化器是高度复杂的软件,你最好在自己的时间里研究一下,它们会根据最有效的数据路径计算执行计划,然后执行最有效的计划。然而,简而言之。
首先,SQL Server 2014中的基数估计器已重新设计,因此在SQL Server 2014中选择的查询计划可能比在SQL Server 2012上执行的查询计划更优,因为两个平台上的表的底层架构设计是相同的。
如果您可以将您的查询与所有不同的表模式定义一起发布,以确切地了解您正在使用的内容,这将会有所帮助。
Here是指向SQL Server 2014基数估计的链接
希望这能有所帮助
https://stackoverflow.com/questions/30184281
复制相似问题