何时更新统计数据?

我继承了一个维护计划,具体包括以下内容: - 清理旧数据 - 检查数据库完整性 - 执行数据库和事务日志备份 - 重组索引 - 更新统计信息 - 删除旧备份和维护计划文件 在这个23分钟的维护计划中,更新统计信息需要惊人的13分钟。在这13分钟期间,访问数据库被阻塞(或者至少,从该数据库到其他数据库的复制被暂停)。 我的问题是: 我们应该在什么时候进行统计信息的更新,以及为什么要这样做? 这似乎是一种我们不必每天都频繁执行的操作。我正试图使我们摆脱"只是因为"的思维方式,避免进行不必要的维护。

2每隔多久/有多少行被插入/更新/删除?对我来说,这是决定性的因素。 - JNK
@JNK 我们每天在整个数据库中插入大约70,000行数据。每月更新大约100行数据。 - Onion-Knight
  1. 如果我们知道通过TABLE有多少行,这将更具相关性。
  2. 以百分比形式表达。每天向一个拥有1百万行的表插入70k行与向一个拥有5亿行的表插入70k行是完全不同的。
- JNK
我推荐使用类似 https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html 这样的解决方案,它只重建/重组和更新所需的内容,这样您可以缩短维护计划所需的时间,并节省大量的日志空间。 - Peter
2个回答

如果您没有为其设置维护窗口,每天更新统计数据可能有点过度。尤其是如果数据库中已经打开了自动更新统计信息的选项。在您的原始帖子中,您提到用户由于这个维护计划而看到了性能下降。难道没有其他时间来运行这个维护计划吗?没有其他窗口吗?我看到您的计划包括索引重组,那么何时重建索引呢?当进行该操作时,统计信息会自动更新(前提是索引的更新未关闭)。 确切地说,您应该多久更新统计信息取决于索引和数据接收到的数据修改量。如果数据的修改量很小(插入、更新、删除),那么可以将更新统计作业的计划安排得更少频繁一些。 判断统计信息是否过时的一种方法是查看执行计划,如果估计行数与实际返回的行数差异很大,那么这表明需要增加更新间隔。在您的情况下,您正在朝相反的方向努力,可能需要进行一些试验。每周更新统计信息,如果开始出现统计信息过时的迹象,那么再做进一步调整。 如果您正在为数据库使用自动更新统计信息功能,请参阅this reference以了解统计信息更新的阈值。

我们每周重建一次索引。 - Onion-Knight
5@Onion-Knight 如果你在重建索引时每周更新统计数据,那也许就足够了,尤其是如果你正在对整个数据库进行全面的索引重建。 - Thomas Stringer

何时更新统计信息?

仅当自动更新统计信息功能无法满足您的要求时才需要更新。 我是说,如果自动创建和自动更新统计信息都开启,并且由于统计信息不准确或过时而导致查询计划不佳,那么控制统计信息的创建和更新可能是个好主意。 但是,如果您对SQL Server的性能和查询执行时间满意。

那么我建议停止在维护计划中使用更新统计信息命令。

更新统计信息很重要且有用 1. 可以使SQL Server查询优化器始终生成良好的查询计划,同时保持开发和管理成本低廉 2. 统计信息被查询优化器用于估计表达式的选择性,从而估计中间和最终查询结果的大小。 3. 良好的统计信息可以使优化器准确评估不同查询计划的成本,然后选择高质量的计划


如果您想手动更新统计信息,您首先应该了解何时自动更新统计信息

如果 SQL Server 查询优化器需要一个表中某个列的统计信息,并且该表自上次创建或更新统计信息以来经历了大量的更新活动,SQL Server 将通过对列值进行抽样(使用自动更新统计信息)来自动更新统计信息。统计信息的自动更新由查询优化或编译计划执行触发,并且仅涉及查询中引用的一部分列。如果 AUTO_UPDATE_STATISTCS_ASYNC 为 OFF,则在查询编译之前会更新统计信息。

以下是关于何时触发 SQL Server 中的更新统计信息的文章:

  1. from simple-talk 第13节:自动更新统计信息何时触发?
  2. support.microsoft 章节:自动确定 Autostats
  3. msdn.microsoft 章节:在 SQL Server 2008 中维护统计信息
在了解何时触发统计信息后,您可以决定何时手动更新统计信息。 要了解有关统计信息及其对性能的影响的更多信息,我推荐BrentOzarKimberly in sqlskills这两个非常好的博客和博主。