【问题标题】:How often should sp_updatestats be called?sp_updatestats 应该多久调用一次?
【发布时间】:2014-01-20 07:17:45
【问题描述】:

处理缓慢执行查询的question of mine 向我介绍了sp_updatestats() 函数。我想采取积极主动的措施定期调用它,而不是等待我的查询在工作时间随机开始超时。我正在考虑在每晚午夜运行它。我的问题是:

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

  2. 在运行此过程时数据库是否锁定?做这件事似乎需要四五分钟。在此期间数据库是否可以访问,或者尝试的查询是否会被阻止?我的测试表明我仍然可以运行查询,但我不确定这是否只是因为我很幸运,查询了当时没有计算统计数据的表。

【问题讨论】:

    标签: sql-server statistics frequency


    【解决方案1】:

    这是来自books on line的引用:

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

    因此,您可以每天运行 UPDATE STATS,但它可能不会执行任何操作。

    Paul Randal's - How rowmodctr works

    Kendra Little's article - Stale Statistics

    White Paper for 2008

    来自 Kalen Delany 的 SQL Server Internals Book 2008。如果你没有这本书的副本,你应该得到一本。

    在 2008 年之前,使用的是 rowmodctr。 2008年以后使用colmodctr。

    这些统计信息用于确定何时超过表的重新编译阈值 (RT),并且统计信息被视为过时并需要更新。

    对于小型表,至少要进行 500 次更改。对于大型表,至少 500 处更改加上 20% 的行数。对于非常小的表,至少要进行 6 处更改。

    最后但同样重要的是,有 FULL、SAMPLE N % 和 RE-SAMPLE 选项可确定要扫描多少行以创建新统计信息。

    所以...

    简而言之,这是什么意思?

    每周重新组织一次索引时,我会运行更新统计信息。我在周末提早这样做,这样如果系统变慢就没有人抱怨了。到目前为止,这对我有用,我几乎没有遇到任何问题。

    【讨论】:

    • 我只是想在写入密集型数据库中补充一点,例如每日 ETL 正在将大量记录更改到数据库表中,应该在 ETL 之后安排这些特定表的更新统计信息,以便后续读取 (它可能是另一个 ETL)不会受到过时的统计数据的影响。发布 ETL 更新统计信息可能需要一些时间,因此这也取决于最终用户是否可以通过 ETL 花费更多时间。
    • 感谢有关统计更新的信息!您提到您每周都会进行索引维护。关于这个的问题:我选择了一个表,右键单击,然后选择重建索引。它说 66% 碎片所以我点击确定。这件事至少运行了五个小时。我最终放弃并中止了(然后恢复了数据库)。需要那么长时间吗?我的整个数据库只有33gb。感谢您的帮助。
    • 嗨 Chad,查看来自 ola.hallengren.com 的脚本。如果您在忙碌的一天中右键单击并重建聚集索引,您可能会遇到问题。此外,根据版本,您可以离线重建。其他要加快速度的事情(例如任务)是在 TEMPDB 中排序。简而言之,这些脚本比维护计划要好得多...
    • 阿努普,你是对的。但是,表越大,在您的统计数据过时之前必须进行的更改就越多。
    • 我可以支持每周的方法,索引后重建。我们在我们拥有的 300 个左右的 dbs 上执行此操作。工作一种享受。但请确保您预计执行时间会很长,因为在大型和写入繁重的系统上运行可能需要相当长的时间。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2018-05-17
    • 1970-01-01
    • 2014-09-21
    • 2023-04-04
    相关资源
    最近更新 更多