我的数据库中有一些自动生成的 _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_ 统计信息(并且有一个高于 20% + 500 的 rowmodctr)
如果对表运行查询并在 WHERE 子句中添加与过时的 _WA_Sys_ 统计信息关联的列之一并检查统计信息的更新日期,我可以看到它已更新。
如果我再次使用 WHERE 子句运行相同的查询,则统计信息不会更新
似乎 _WA_Sys 统计信息在运行将使用它们的查询时更新并且它们已过时?
SQL Server 只会自动更新它使用的统计信息。它可能不会主动使用 _WA_Sys 统计数据进行基数估计,尽管它可能会加载它们作为决策的一部分。
要查看您的查询正在使用哪些统计信息,请将其添加到查询的末尾,然后查看“消息”选项卡:
OPTION(QUERYTRACEON 3604, QUERYTRACEON 2363);
如果您的数据库在 2014 年之前处于兼容级别,您将需要这些:
OPTION(QUERYTRACEON 3604, QUERYTRACEON 9292, QUERYTRACEON 9204);
这些不会告诉您为什么它不使用某些统计信息,但通常如果在同一列上创建了具有较高采样百分比的统计信息,则采样百分比较低的统计信息将不受欢迎。
请记住,统计信息更新不会在修改时发生,只有在运行使用它们的查询时才会发生