【发布时间】:2014-12-19 03:47:24
【问题描述】:
我有一个数据仓库数据库,但我在使用 SQL Server 2014 的新基数估计器时遇到问题。
将数据库服务器升级到 SQL Server 2014 后,我观察到查询性能有很大差异。一些查询的执行速度要慢得多(SQL 2012 为 30 秒,而 SQL 2014 为 5 分钟)。 在研究了执行计划后,我发现 SQL Server 2014 上的基数估计值很差,我找不到原因。
以下是 SQL 2012 与 SQL 2014 中查询执行计划(左上角运算符)的示例:
一些细节:
我的查询是典型的数据仓库事实表加载查询。我查询一个事务表并加入很多 (15-20) 个维度表(总是有 0 或 1 条记录从维度表中加入)。
我已更新所有表的统计信息(使用 FULLSCAN)以确保统计信息是最新的。
对维度表的业务键进行索引(唯一非聚集索引)。在我看来,由于这个索引的唯一性,旧的基数估计器(SQL 2012)正确地假设有最大值。 1 条连接的记录(估计的记录数在执行计划中没有变化)。
我试图将问题缩小到最简单的示例 - SELECT with 2 joins:
以下是 SQL 2012 与 SQL 2014 中运算符 1 和 2 的基数估计:
| Est.rows - SQL2012 | Est.rows - SQL2014
Operator 1 | 7653 | 7653
Operator 2 | 7653 | 10000
如您所见,SQL Server 2014 未达到估计值 30% 以上(10000 对 7653)。因为我有cca。一个典型的查询有 15 到 20 个连接,最终的估计值相差甚远。
我可以将数据库置于较低的兼容模式 (110),然后它工作正常(与 SQL Server 2012 上相同),但我真的很想知道这种行为的原因是什么。为什么 SQL Server 2014 的基数估计结果错误?
【问题讨论】:
-
这可能与新 CE 中设计不同的谓词的独立性/相关性有关。不确定它是如何工作的。你可以在这里阅读更多:sqlperformance.com/2013/12/t-sql-queries/…
-
很好地了解 2014 年的新基数估计器,以及它们如何得出查询计划值:thomaslarock.com/2014/07/…
标签: sql-server sql-server-2014 cardinality-estimation