实际行数大于估计的行数

时间:2016-10-31 09:44:10

标签: sql-server tsql query-planner

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

该表的集群主键定义为:

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

enter image description here

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

问题:

  • 为什么实际行数大于估计的行数?它是否有任何性能影响?

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:-1)

两个主要原因:

  1. 统计数据过时
  2. 正在使用错误的缓存计划
  3. 关于2,这通常是由于参数嗅探问题,而这又是由于某些类型的查询造成的。

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

    如果您使用过时的计划,有许多方法可以解决这个问题,还有很多方法可以将其清除,而且这些方法都在google上。