如果SQL Server统计信息在负载与非峰值使用情况下更新,它们是否会收集不同的数据?

时间:2011-08-01 20:35:05

标签: sql sql-server sql-server-2008 statistics

Aright,基本问题是:有没有人听过任何暗示统计数据需要在日常使用中更新才能生效而非高峰时段的内容?

我们最近遇到了一个数据库问题,其中查询计划偏离了轨道并决定使用表扫描而不是搜索。当然,这会导致严重的锁定问题,并在我们追踪索引并更新正确的统计数据时导致客户延迟。

查询计划似乎是我们每周在系统上运行的维护计划的结果。该计划的最后一步是更新统计数据。最近唯一改变的是统计更新被设置为10%的样本而不是之前的30%。 (我们现在改回来了)

根据我们谈过的一位DBA,我们需要在加载期间更新统计信息,否则SQL将无法计算最佳数据的统计信息。他声称如果你在我们目前使用的低使用时间内更新统计数据,那么统计数据将不那么准确。

这违背了我对SQL统计数据的理解,我在网上找不到任何告诉我应该在某个时间更新统计数据的内容。

4 个答案:

答案 0 :(得分:2)

他错了(另一个DBA)。表统计信息是存储在列中的数据的函数,与服务器负载完全无关。事实上,在高峰时段更新统计数据几乎是最糟糕的时间(更新统计数据显然会在更新运行时对性能产生有害影响)。

在非高峰时段使用FULLSCAN更新您的统计数据以获得最高准确度,然后不管它们。

编辑:正如http://blogs.msdn.com/b/chrissk/archive/2008/08/27/do-we-need-to-run-update-statistics-with-fullscan.aspx指出的那样,带有fullscan的统计数据在某些情况下可能不是特别有用(基本上如果你有一个表,你正在批量修改数据)。如果表中有足够的行已更改(我认为它大约为500行或20%,以较大者为准),则自动统计信息将重建统计信息,然后使用这些自动重建的统计信息而不是全扫描。您可以手动管理统计信息(推荐),也可以启用自动统计信息,但也可以手动安排统计信息重建。

答案 1 :(得分:1)

统计数据是关于“数据分发”而不是“在服务器上加载”

如果你每晚都这样做,那么你在白天更新统计数据的可能性就会降低。

然后你也完全或接近全部采样......

答案 2 :(得分:1)

这取决于你的负担。如果您的工作负载来自频繁的插入和删除(例如,类似队列的系统),则在高峰时段与非工作时间之间统计数据看起来会有很大差异,因为基础表格看起来也会有很大不同(表格会有很多项目在白天,但在夜间大多是空的)。

如果表格在非工作时间和高峰时段看起来相同(典型情况是每天工作负荷主要添加新数据),那么在夜间对统计数据进行快照是安全的。

答案 3 :(得分:0)

正如其他人所指出的那样,统计数据与潜在密钥空间之间的数据分布有关,因此它们不依赖于负载。也就是说,我已经看到许多数据库在非工作时间处理某些表(ETL登台等),这些数据库会根据统计数据运行的小时数来严重扭曲统计数据。这并不是说白天收集的统计数据会更好,只是它们会有所不同。

与一般的索引优化一样,收集统计信息的目标是调整到您希望查询以最佳方式运行的场景。因此,如果您希望查询在表中以一百万行最佳地运行,则在表中生成具有一百万行的统计信息(分布在各种索引键空间中或多或少,就像查询应该以最佳方式运行时那样)。 / p>