我有一个数据仓库数据库,我在使用 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 条连接的记录(估计的记录数在执行计划中没有变化)。
我试图将问题缩小到最简单的示例——带有 2 个连接的 SELECT:
这是 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 的基数估计结果错误?