【问题标题】:SQL: actual number of rows difference [duplicate]SQL:实际行数差异[重复]
【发布时间】:2011-08-22 15:47:43
【问题描述】:

可能重复:
How does SQL server work out the estimated number of rows?

刚才在翻SQL Server Graphical Execution plan,遇到如下两个信息:

  1. 实际行数-2385
  2. 估计行数-180

我想知道为什么会出现这种差异。你能解释一下它们之间有什么区别吗?如果你能用一些例子来解释会很有帮助。

谢谢。

【问题讨论】:

标签: sql sql-server sql-server-2008 sql-execution-plan


【解决方案1】:

行估计基于统计数据。不准确的估计可能来自多种因素:

  • 您的数据或统计数据中的基数较低
  • 过时或不完整的统计数据
  • 低效的执行计划
  • 并发问题(从创建执行计划到执行时间的数据变化)

通常,在遇到问题之前不要担心。

根据我的经验,它通常基于您统计数据中的基数。

如果您基于两个字段进行选择,这两个字段都有索引,则行估计将基于各自索引中值的可能性乘以总行数的乘积。

【讨论】:

  • +1。你最好的建议是不要担心事情,除非它们成为问题是必不可少的。如果您添加一些有关正确统计维护的详细信息(我个人想了解更多),这将是一个完美的答案
  • @michael - 这部分并不太复杂 - 确保 AUTO UPDATE STATISTICSAUTO CREATE STATISTICS 已打开,如果您的餐桌非常繁忙,最好使用 FULLSCAN 进行手动更新维护期间。
【解决方案2】:

我不太了解 SQL Server,所以这是一个有根据的猜测:保存的关于表的统计数据实际数据之间存在差异在表中。

数据库保存有关表的统计数据,优化器可以使用这些数据为您要执行的 SQL 找到最佳(成本最低)的查询计划。这些统计数据包括例如总行数和跨列的数据分布(例如,字段“性别”包含 60% 的值“m”和 40% 的值“f”)。您可能在这里看到的是统计信息已过时,因此优化器所做的计算不准确:优化器假定结果包含 180 行,但实际上(执行查询时)它返回 2385。尝试更新统计信息(不知道 SQL server 中的确切语法),看看是否会改变数字。

【讨论】:

  • 你能用一些例子来解释它可能不同的地方吗?
  • @Rocky 如果您的状态已过期 - 即上次计算时您只有几行但现在有很多行 - 这可能会发生。您可以将统计信息设置为自动重新计算(尽管我不确定这在实践中是如何工作的),或者您可以创建一个按计划重新计算它们的维护计划(我通常会这样做)。
  • @Rocky:我重新解释了一下,希望现在更清楚。
猜你喜欢
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2018-02-19
  • 2019-03-21
相关资源
最近更新 更多