_WA_Sys_ 统计何时更新?

SEa*_*986 7 statistics sql-server-2014 cardinality-estimates

我的数据库中有一些自动生成的 _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
Run Code Online (Sandbox Code Playgroud)

有一个表包含许多过时的 _WA_Sys_ 统计信息(并且 rowmodctr 高于 20% + 500)

如果对表运行查询并在 WHERE 子句中添加与过时 _WA_Sys_ 统计信息关联的列之一并检查统计信息的更新日期,我可以看到它已更新。

如果我再次使用 WHERE 子句运行相同的查询,则统计信息不会更新

似乎 _WA_Sys 统计信息在运行查询时更新,将使用它们并且它们已过时?

Eri*_*ing 10

SQL Server 只会自动更新它使用的统计信息。它可能不会主动使用 _WA_Sys 统计信息进行基数估计,但它可能会将它们作为决策的一部分加载。

要查看查询使用了哪些统计信息,请将其添加到查询的末尾,然后查看消息选项卡:

OPTION(QUERYTRACEON 3604, QUERYTRACEON 2363);

如果您的数据库在 2014 年之前处于兼容级别,您将需要这些:

OPTION(QUERYTRACEON 3604, QUERYTRACEON 9292, QUERYTRACEON 9204);

这些不会告诉您为什么它不使用某些统计信息,但通常如果在同一列上创建了具有较高采样百分比的统计信息,则不喜欢具有较低采样百分比的统计信息。

请记住,统计更新不会在修改时发生,只有在使用它们的查询运行时才会发生