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);
这些不会告诉您为什么它不使用某些统计信息,但通常如果在同一列上创建了具有较高采样百分比的统计信息,则不喜欢具有较低采样百分比的统计信息。
请记住,统计更新不会在修改时发生,只有在使用它们的查询运行时才会发生
| 归档时间: |
|
| 查看次数: |
830 次 |
| 最近记录: |