【问题标题】:Actual number of rows greater than estimated number of rows实际行数大于估计行数
【发布时间】:2016-10-31 09:44:09
【问题描述】:

我想知道为什么我的实际行数大于估计的行数?

该表有一个聚集的主键定义为:

CONSTRAINT [PK_AIRQUALITYTS] PRIMARY KEY CLUSTERED 
(
 [FeatureID] ASC,
 [ParameterID] ASC,
 [MeasurementDateTime] DESC
)

虽然我已经更新了 MeasurementDateTime 列的 STATISTICS 并重建索引。


问题:

  • 为什么实际行数大于估计行数?它对性能有什么影响吗?

  • 我是否应该始终尝试使实际行数等于估计的行数?或者实际和估计的行数有多少变化不应该打扰我们?

【问题讨论】:

  • 你用什么脚本来更新你的统计数据?你使用 WITH FULLSCAN 吗?
  • 答案就在您的问题中,其中一个数字是估计值 - 估计值基于统计抽样,统计数据可能会过时,但这不是估计值的唯一原因out - 您可以尝试使用 UPDATE STATISTICS 作为实验来更新统计信息。

标签: sql-server tsql query-planner


【解决方案1】:

Q1:这取决于该表总共有多少行。因为这就是 SQL 在构建执行计划时决定使用哪些操作的方式。 AFIK,如果 SQL 查询优化器估计需要检索大约 1/3 或更多的表/索引,则 SQL 查询优化器将决定使用 SCAN over SEEK 操作 [cardinality estimate question on SO]

所以简短的问题是:这取决于具体情况。

Q2:一般规则是尝试仅优化您知道存在性能问题的查询。

【讨论】:

【解决方案2】:

两个主要原因:

  1. 统计数据已过期
  2. 正在使用错误的缓存计划

关于 2,这通常是由于参数嗅探问题,而这又是由于某些类型的查询造成的。

我们不知道您的工作负载是什么 - 查询或存储过程。

如果你使用的是一个过时的计划,有很多方法可以解决,还有很多方法可以清除它,它们都在谷歌上。

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2016-09-01
    • 2017-10-04
    • 2019-11-30
    相关资源
    最近更新 更多