我在生产数据库上进行了每晚的 sp_updatestats 操作,似乎运行良好,除了一个特定的存储过程在更新后遇到性能问题。
开发团队目前正在修复该过程(我建议的一些新索引和一些查询重组),但目前唯一的解决方法是执行
UPDATE STATISTICS [SuperGiantTable]
WITH FULLSCAN
那么,问题是,我可以强制 sp_ updatestats 执行“使用全扫描”选项吗?我可以吗想如果不是,那么我可能会将此添加到 UPDATE STATISTICS 命令上方,以便在 sp_updatestats 之后立即运行。
顺便说一下,SQL 2000。
答案1
正如 KPWINC 所说:“这确实取决于情况”。
还有其他一些因素会影响您问题的答案,因此一般性的回答可能并不合适。
Microsoft MSDN 中有 sp_updatestats 的条目(http://msdn.microsoft.com/en-us/library/aa260337(SQL.80).aspx)和“更新统计信息”(http://msdn.microsoft.com/en-us/library/aa260645(SQL.80).aspx)
首先回答你的最后一个问题:
您需要重新阅读 SQLServerPedia 条目。具体来说:
索引重建将自动更新索引的统计信息(样本量为 100%,通常比使用 sp_updatestats 得到的结果更好)。索引重建完成后,可以使用 sp_updatestats 更新需要注意的其他统计信息 (2005 年以后)。
查看 UPDATE STATISTICS(2000)文档,对于采样说明如下:
注意默认行为是对目标表或索引视图执行样本扫描。SQL Server 自动计算所需的样本大小。
Kimberly Tripp 整理了一些关于统计数据、索引和数据库维护计划的博客文章(http://www.sqlskills.com/BLOGS/KIMBERLY/category/Statistics.aspx)。尽管这些信息可能对您有直接用处,也可能没有,但每篇博文的指导意义应该是,而且所引用的网站也可能会有帮助。
答案2
这确实取决于...
有多少个数据库?
数据库有多大?
活动量多少?
sp_updatestats(默认情况下)使用默认采样率更新统计信息。您可以尝试使用重新采样选项,但这仅在自上次更新统计信息以来未发生自动更新时才有效(自动更新也使用默认采样率)。
重建索引时,统计信息将通过完整扫描进行更新,并且大多数人在重建索引后都会看到良好的性能。
只有极少数情况下人们才会关闭自动统计功能。我建议将其保持开启状态。
让一项作业以适当的间隔运行(这取决于每个表的数据修改模式)并使用全扫描或其他高采样率执行手动统计更新。
一般我会按照如下方式进行:
如果它是一个大型数据库--事务日志每小时备份一次。
-- 每日差异备份。 -- 每日碎片整理。 -- 每日更新统计数据。
-- 每周重新索引一次。 -- 每周完整备份一次。
很大程度上取决于数据库和交易。
答案3
还有一件事要记住,自动计算的采样率可能会导致生成的直方图和密度向量不能正确解释您可能存在的任何数据偏差,而存储过程恰好就是针对这种偏差进行操作的。
您知道采样统计信息更新和全扫描统计信息更新之后的存储过程的查询计划之间的区别吗?
还有一件事——要小心维护计划,重建索引,然后更新那些作为重建副作用而更新的相同统计信息——你最终可能会得到更差那么如果您只是将重建更新的统计数据留在原处。
谢谢