在我正在研究的系统中,我们看到一个特定的SELECT使用聚簇索引扫描,而不是使用为此SELECT创建的索引。我看了一下索引的统计数据,发现它们已经26天了。我用FULLSCAN更新了统计数据。现在SELECT正在使用索引。
此数据库中的AUTO_UPDATE_STATISTICS已在整个时间内启用。为什么统计数据没有更新?
查看STATS_DATE()输出(下面的查询):
SELECT
object_name = Object_Name(ind.object_id),
IndexName = ind.name,
StatisticsDate = STATS_DATE(ind.object_id, ind.index_id),
ind.type
FROM SYS.INDEXES ind
order by STATS_DATE(ind.object_id, ind.index_id) desc
我发现很多索引最近都在更新。一些每天都有数据更新的大型表在几周内没有更新的统计信息。
当启用AUTO_UPDATE_STATISTICS时,MSSQL 2005如何决定何时更新统计信息?文档说明:
只要查询执行计划中使用的统计信息未通过当前统计信息的测试,就会启动统计信息更新。 。 。几乎总是,当大约20%的数据行发生变化时,统计信息会更新。
这可以信任吗?也许这些表格太大,以至于即使每天都插入记录,“当前的统计测试”也会过去。
答案 0 :(得分:0)
以下是Microsoft白皮书中算法详细信息的链接
http://technet.microsoft.com/sv-se/library/cc966419(en-us).aspx#XSLTsection130121120120
来自Erland Sommarskog的quoted:
当你有一张空桌子时, 自动调节器首先在500后开始 行。从那里,自动停止设置 当20%的行已经 改性。这是一些措施 rowmodctr。
这有大表的效果 单调增长的关键所在 查询与主干有关 他们的统计数据也更新了 很少。
而小表所有行 经常更新,或在哪里或 行被添加和删除,有他们的 统计数据经常更新,可能会 导致重新编译问题。
答案 1 :(得分:0)
统计信息更新为行数的500 + 20%。在某些情况下这可能需要很长时间,因此有时候手动执行此操作会更好。
了解更多信息,请点击此处: http://www.sqlserveroptimizer.com/2013/02/how-to-make-your-sql-server-index-faster-by-updating-statistics/