为什么将自动更新统计信息设置为False?


10

作为更广泛的收购项目的一部分,我刚刚继承了大约20个SQL Server实例。我正在评估性能,我不喜欢实施维护计划的方式。

我看到每天进行一揽子索引重建(我可以处理这一问题),并且每天都在手动更新统计信息。

大约一半的数据库已设置为“自动更新统计信息= False”,原因除了我被告知要减少“性能问题”外,其他原因还不清楚。

我一直认为并努力将其设置为True的最佳实践,并认为如果此设置为True,则不需要手动更新。我错了吗?

谁能解释一下将此设置为False会有什么好处,但是每天进行一次手动更新呢?

我应该提到,某些数据库具有很高的事务性(每天有数以百万计的插入,删除,更新),而其他数据库的事务处理率很低,而有些则全部是只读的。尽管没有任何韵律或原因,但关于“自动更新”设置为“否”的信息。好像是彩票。

Answers:


6

您是对的,我也相信在大多数情况下Auto Update statistics应该将其设置为true,我们应该允许SQL Server决定何时更新统计信息,并相信我做得很好。设置为true时,请确保更新有关字段中数据分布的统计信息,这最终将帮助优化器准备更好的计划。这里要注意的重要一点是,当表中20%的数据发生更改时,自动更新统计信息就会触发。因此,您不应该认为在具有10万行的表上,如果更新了10行,则将触发状态更新。

Paul Randal在博客“ 了解统计信息将自动更新”中进行了更深入的分析。如果将此选项设置为true,我没有看到任何缺点。是的,当此选项设置为true时,您会看到一些I / O活动。

一个可以从博客中得出的重要结论是

即使统计信息由于修改而过时,修改完成后也不会自动更新。下一次查询计划使用时,该统计信息将自动更新。

对于仅读取数据库或仅执行选择操作而没有DML操作的数据库,在这种情况下,可以将选项保留为false,但如果将其设置为true,则不会有任何危害。我们通常会看到具有一定活动量的数据库。


10

这个评论太长了,因此我可能会想关闭另一种可能要关闭自动更新统计信息的情况。我曾使用支持大量OLTP工作负载的数据库以及以毫秒为单位的严格查询性能SLA。几乎所有查询都是琐碎的,非常关注查询和索引调优细节,并且某些表很大。在这种情况下,在高峰时段更新统计信息没有太大价值,并且自动更新统计信息会违反SLA。因此,维护是在非高峰时段通过计划的工作完成的。

另一个选择是同时打开AUTO_UPDATE_STATISTICSAUTO_UPDATE_STATISTICS_ASYNC数据库选项。这将允许查询根据过时的统计信息执行执行计划,而不会产生同步更新统计信息的开销。只要服务器的大小可容纳查询工作负载以及后台统计信息更新,这对于OLTP工作负载尤其合适。


我试图考虑一个例子,其中auto_update_stats实际上会引起问题,这是一个很好的例子-为了出色的解决方法,我会对其进行两次投票(如果可以的话),从而避免了正常的stats延迟。查询
SqlRyan

1
我曾遇到过较大数据库(VLDB)的情况,auto_update stats选项为ON,SQL将在工作日的不适当时间启动。我将其关闭,必须对手动更新特定表和统计数据更具策略性,而不是让服务器确定表和时间。这使我的系统更具可预测性,但是管理成本较高(无疑),但是需要避免干扰更新任务。如果您想通过典型的索引/统计信息管理对系统进行“彻底屏蔽”,那么请继续使用它。否则,某些情况可能需要详细的策略。
SnapJag

6

通常,我会说启用自动更新统计信息是有好处的。但是,像任何设置一样,有一些原因可以将其打开或关闭。

一种是某些表的流失率很大,也许查询对准确的统计数据不是很敏感。考虑一下ETL或其他大量场景,在这些场景中您将更改大量数据,但是要么不从那里读取数据,要么就不读取太多数据。启用自动统计信息更新并导致大量的I / O提供永远不会使用的更准确的统计信息没有什么意义。

您可能还会遇到一整天要多次更新数据的场景,但不一定要在每次更新后都更新统计信息。(假设仅在一天中的特定时间查询数据-无需在此期间再次查询数据的情况下无需多次更新统计信息。)

也许您只是有大量写工作量。或者读取通常是完整扫描,而统计数据并不十分重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.