新的基数估算器(SQL Server 2014)已经过时了

sas*_*aso 19 sql-server sql-server-2014

我有一个数据仓库数据库,我遇到了SQL Server 2014的新基数估算器的问题.

将数据库服务器升级到SQL Server 2014后,我发现查询性能有很大差异.有些查询的执行速度要慢得多(SQL 2012中为30秒,SQL 2014中为5分钟).在研究执行计划之后,我已经看到SQL Server 2014上的基数估计已经过时了,我无法找到它的原因.

以下是SQL 2012与SQL 2014中的查询执行计划(左上角运算符)的示例:

经过调整的行数

一些细节:

  • 我的查询是典型的数据仓库事实表加载查询.我查询一个事务表并加入很多(15-20)维度表(总是从维表中加入0或1个记录).

  • 我已更新所有表的统计信息(使用FULLSCAN)以确保统计信息是最新的.

  • 维度表的业务键被索引(唯一的非clusted索引).在我看来,由于这个索引的唯一性,旧的基数估计(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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,SQL Server 2014错过了超过30%的估计(10000对7653).因为我有cca.15-20连接在一个典型的查询中,最终估计结束了.

我可以将数据库置于较低的兼容模式(110),然后它可以正常工作(与SQL Server 2012上的相同),但我真的想知道这种行为的原因是什么.为什么SQL Server 2014的基数估算结果错误?

BI *_*ude 5

我认为今天对这个有趣的问题没有简单的答案.我知道的最佳答案是以下视频:http://channel9.msdn.com/events/TechEd/NorthAmerica/2014/DBI-B331#fbid=.它有许多新旧估算器的例子.该视频长约50多分钟,但值得花时间.

与此问题相关的视频摘要:

基数估计的旧假设:

  1. 均匀性 - 数据均匀分布.
  2. 独立性 - 第1列与第2列无关.
  3. 遏制 - 当两个属性可能相同时,它们被假定为相同.
  4. 包容 - 应该有一个匹配.

要在SQL SERVER 2014中使用SQL SERVER 2012基数估算器,请使用以下选项:

  • 选项(querytraceon 9481) - 转换为2012

什么是新估算器(基于视频):

  • SQL Server使用索引中的平均选择性,并通过将键的密度乘以索引中的总行数来估计行数.
  • 新的估算器在锯齿状分布中不能很好地工作.
  • 估计器之间的大多数差异都基于WHERE子句.
  • 新的基数估算器认为表之间存在相关性.
  • 您可以创建筛选的统计信息以改进查询.(http://msdn.microsoft.com/en-us/library/ms188038.aspx)

要做/清单:

1. Auto Create / Update Stats
2.  Check database compatibility mode (120/110)
3.  Test using query trace flags
4.  XML showplan
Run Code Online (Sandbox Code Playgroud)

更新 基数估算器中的新增功能(SQL Server 2016)

  1. 越准确.
  2. CE预测您的查询可能会返回多少行
  3. SQL Server 2016查询存储
  4. 跟踪CE的基数预测的另一个选项是使用名为query_optimizer_estimate_cardinality的扩展事件
  5. 行政长官了解最高价值可能高于上次收集统计数字时的最高价值
  6. CE理解同一个表上的过滤谓词通常是相关的
  7. CE不再假设来自不同表的过滤谓词之间存在任何相关性

更多细节:

https://docs.microsoft.com/en-us/sql/relational-databases/performance/cardinality-estimation-sql-server

https://www.sqlshack.com/query-optimizer-changes-in-sql-server-2016-explained/