何时更新_WA_Sys_统计数据?

我在我的数据库中有一些自动生成的_WA_Sys_统计数据,这些数据已经有一段时间没有更新了(与同一表中的其他统计数据相比较)。

根据经验法则,在表格中行数>500时,当数据变化超过20% + 500行时,统计数据会被更新。

然而,通过以下查询,我可以看到

SELECT  t.name,
        i.name,
        i.rowcnt,
        i.rowmodctr,
        p.last_updated
FROM    sys.sysindexes i
        JOIN sys.tables t
            ON i.id = t.object_id
        JOIN sys.stats s
            ON s.object_id = t.object_id AND i.name = s.name
        CROSS APPLY sys.dm_db_stats_properties(s.object_id,s.stats_id) p
WHERE   rowmodctr > 0
ORDER BY i.rowmodctr DESC

这里有一个表格,其中有一些非常过时的_WA_Sys_统计数据(并且rowmodctr的值超过了20% + 500)。

如果对该表格运行一个查询,并在WHERE子句中添加与过时的_WA_Sys_统计数据相关的列,并检查统计数据的更新日期,我可以看到它已经更新了。

如果再次运行带有WHERE子句的相同查询,统计数据不会更新。

似乎_WA_Sys_统计数据只在运行使用它们且它们过时的查询时才会更新?

1个回答

SQL Server只会自动更新它使用的统计信息。尽管它可能在决策过程中加载_WA_Sys统计信息,但它可能不会主动使用这些统计信息进行基数估算。 要查看查询中使用的统计信息,请将以下内容添加到查询的末尾,并查看“消息”选项卡: OPTION(QUERYTRACEON 3604, QUERYTRACEON 2363); 如果您的数据库兼容级别低于2014年,则需要添加以下内容: OPTION(QUERYTRACEON 3604, QUERYTRACEON 9292, QUERYTRACEON 9204); 这些选项无法告诉您为什么不使用某些统计信息,但通常情况下,如果在同一列上创建了具有较高采样百分比的统计信息,则较低采样百分比的统计信息将被忽视。 请记住,统计信息的更新不会在修改时发生,只有在运行使用它们的查询时才会更新。