sp_updatestats需要多久调用一次?

13

我的一个问题涉及到执行缓慢的查询,让我了解到了sp_updatestats()函数。我想采取主动措施定期调用它,而不是等待我的查询在工作时间随机开始超时。我考虑每晚在午夜运行它。我的问题是:

  1. 有没有有用的方法确定何时应该调用此过程,而不是每晚盲目运行它?文档说SQL Server会自动更新这些统计信息。但更新频率是多少?我如何知道何时需要介入并手动执行它?

  2. 在运行此过程时,数据库是否会锁定?它似乎需要四到五分钟才能完成。在此期间,数据库是否可访问或将尝试的查询被阻止?我的测试表明我仍然可以运行查询,但我不确定这只是因为我很幸运,在那个精确的时刻查询未计算统计信息的表。

1个回答

17
这里是来自在线书籍的一句话:

sp_updatestats仅基于sys.sysindexes目录视图中的rowmodctr信息更新需要更新的统计信息,从而避免对未更改行的统计信息进行不必要的更新。

因此,您可以每天运行UPDATE STATS,但可能不会做任何事情。
来自Paul Randal's - How rowmodctr worksKendra Little's article - Stale StatisticsWhite Paper for 2008
摘自Kalen Delany的《SQL Server Internals Book 2008》。如果您没有这本书,应该获取一本。
在2008年之前,使用rowmodctr。在2008年之后,使用colmodctr。
这些统计数据用于确定表的重新编译阈值(RT)何时超过,并且统计数据被认为已过期并需要更新。
对于小表,至少必须发生500个更改。对于大型表,至少要发生500个变化加上行数的20%。对于非常小的表,至少要发生6次更改。
最后,有FULL、SAMPLE N%和RE-SAMPLE选项,它们确定要扫描多少行以创建新的统计数据。
简而言之,当重新组织索引时,每周运行更新统计信息。我会在周末早些时候进行此操作,以免系统变慢而导致投诉。到目前为止,这对我很有效,几乎没有任何问题。

1
我只想补充一点,在写入密集型数据库中,例如每天的ETL正在将大量记录更改为数据库表格,应该在ETL之后安排更新这些特定表格的统计信息,以便随后的读取(可能是另一个ETL)不会受到过时统计信息的影响。 ETL后更新统计信息可能需要时间,因此还取决于ETL是否可以花费更多时间来满足最终用户的需求。 - Anup Shah
感谢您提供有关统计更新的信息!您提到每周运行索引维护。对此有一个问题:我选择了一张表,右键单击并选择了重建索引。它显示了66%的碎片,所以我点击了确定。这个过程至少运行了五个小时。最终我放弃并中止了它(然后还原了数据库)。这需要那么长时间吗?我的整个数据库只有33GB。感谢您的帮助。 - Chad Decker
1
嗨 Chad,看看来自http://ola.hallengren.com/的脚本。如果您在繁忙的白天时间右键单击并重建聚集索引,则可能会遇到问题。此外,根据版本,您可以离线重建。尝试加速此类任务的其他方法是在TEMPDB中进行排序。简而言之,这些脚本比维护计划要好得多... - CRAFTY DBA
Anup,你说得对。然而,表越大,在统计数据过期之前需要进行的更多更改。 - CRAFTY DBA
我可以支持每周重建索引的方法。我们在我们管理的大约300个数据库上都这样做。效果很好。但请确保预计执行时间会比较长,因为在大型且写入频繁的系统上运行可能需要相当长的时间。 - pim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接