处理缓慢执行的查询的question of mine向我介绍了sp_updatestats()
函数。我想采取积极主动的步骤定期调用它,而不是等待我的查询在工作时间内随机启动超时。我正考虑每晚午夜运行它。我的问题是:
是否有一种有用的方法可以确定何时应该调用此过程而不是每晚盲目运行它?文档说SQL Server自己更新这些统计信息。但是频率是多少?我怎么知道什么时候需要介入并手动执行它?
运行此过程时数据库是否锁定?它似乎需要大约四到五分钟才能做到。在此期间是否可以访问数据库,或者是否会阻止尝试查询?我的测试表明我仍然可以运行查询,但我不确定这是否只是因为我很幸运,查询了一个在那个精确时刻没有计算统计数据的表。
答案 0 :(得分:16)
以下是books on line的引用:
sp_updatestats仅根据sys.sysindexes目录视图中的rowmodctr信息更新需要更新的统计信息,从而避免对未更改的行进行不必要的统计更新。
因此,您可以每天运行UPDATE STATS,它可能不会执行任何操作。
Paul Randal's - How rowmodctr works
Kendra Little's article - Stale Statistics
来自 Kalen Delany的SQL Server Internals Book 2008 。如果你没有这本书的副本,你应该得到一本。
2008年之前,使用了rowmodctr。 2008年之后,正在使用colmodctr。
这些统计信息用于确定何时超出表的重新编译阈值(RT)并且统计信息被视为已停止且需要更新。
对于小型表,必须至少进行500次更改。对于大型表,至少有500个更改加上20%的行数。对于非常小的表,至少有6次更改。
最后但并非最不重要的是,有FULL,SAMPLE N%和RE-SAMPLE选项,用于确定要扫描的行数以创建新统计信息。
所以......
简而言之,这是什么意思?
每周一次重新组织索引时,我会运行更新统计信息。我是在周末早些时候这样做的,所以如果系统变慢,没有人会抱怨。到目前为止,这对我有用,我几乎没有任何问题。