sql-server - 新的基数估计器 (SQL Server 2014) 还很遥远

标签 sql-server sql-server-2014 cardinality-estimation

我有一个数据仓库数据库,但我在使用 SQL Server 2014 的新基数估计器时遇到问题。

将数据库服务器升级到 SQL Server 2014 后,我发现查询性能存在很大差异。某些查询的执行速度要慢得多(SQL 2012 中为 30 秒,而 SQL 2014 中为 5 分钟)。 在研究执行计划后,我发现 SQL Server 2014 上的基数估计相差很大,而且我找不到原因。

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

Estimed Number of Rows

一些细节:

  • 我的查询是典型的数据仓库事实表加载查询。我查询事务表并连接很多 (15-20) 个维度表(始终有 0 或 1 条记录从维度表连接)。

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

  • 维度表的业务键有索引(唯一非聚集索引)。在我看来,由于该索引的唯一性,旧的基数估计器(SQL 2012)正确地假设有最大值。 1 个连接的记录(执行计划中估计的记录数不会改变)。

我试图将问题缩小到最简单的示例 - 带有 2 个连接的 SELECT:

Join

以下是 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的基数估计器结果错误?

最佳答案

我认为今天这个有趣的问题没有简单的答案。我知道的最佳答案是以下视频: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)

待办事项/ list :

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

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

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

更多详细信息:

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

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

关于sql-server - 新的基数估计器 (SQL Server 2014) 还很遥远,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528713/

相关文章:

sql - 加入表索引性能改进关注点

sql-server - 使用 Windows 身份验证登录本地 SQL Server 实例

SQL Native Client ODBC 应用程序在 SQLDisconnect 后未断开连接且未池化?

sql - 列中两个值之间的重复值

html - 如何将sql查询结果转换为带有属性的html标签

algorithm - flajolet martin 素描是如何工作的?

SQL Server 2014 - 某些查询非常慢(基数估计器)

sql-server - : OPTIMIZE_FOR_SEQUENTIAL_KEY 处的语法错误

sql-server - TSQL 'lag' 分析函数 - 性能意外不佳