AUTO_UPDATE_STATISTICS无法更新某些索引的统计信息。为什么?

时间:2010-11-25 02:06:08

标签: sql-server-2005

在我正在研究的系统中,我们看到一个特定的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%的数据行发生变化时,统计信息会更新。

这可以信任吗?也许这些表格太大,以至于即使每天都插入记录,“当前的统计测试”也会过去。

2 个答案:

答案 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/