我正在使用SQL SERVER 2012
我的数据库中有我的Auto Update Stats
ON。
从下面的链接我了解到,自动更新统计信息将SQRT(1000 * Table rows)
在表行的每次更改时触发。
https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/
我创建了一个包含 1000 条记录的表
SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
name
INTO stst
FROM sys.objects
创建统计信息
CREATE STATISTICS rn
ON stst (rn)
CREATE STATISTICS name
ON stst (name)
检查创建的统计信息
DBCC show_statistics('stst', rn) -- Rows 500
DBCC show_statistics('stst', name) -- Rows 500
按照公式
select SQRT(1000 * 500) -- 707.106781186548
所以如果我在我的表中添加/修改707.106781186548
记录自动更新统计应该触发
向我的表中添加1000
更多记录,这应该足以触发auto update stats
INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
a.name
FROM sys.objects a
开火auto update stats
Select * from stst
检查统计数据
DBCC show_statistics('stst', rn) -- Rows 500
DBCC show_statistics('stst', name) -- Rows 500
不幸的是仍然Rows
是500
唯一的。
即使在将1000
记录插入我的表之后,这显然比707.106781186548
执行SELECT
自动更新统计信息没有触发的原因要大?我在这里想念什么
仅当启用跟踪标志 2371 时才使用新计算,但在 SQL Server 2016 上,上下文数据库兼容性级别设置为 130 时,这是默认行为。请参阅 Microsoft 知识库文章 2754171:
控制 SQL Server 中的 Autostat (AUTO_UPDATE_STATISTICS) 行为
修改数据时不会更新统计信息。当基于成本的优化发现查询的有趣统计信息过时时,将触发统计信息更新。
对于非常简单(“琐碎”)的查询,优化器不会进入基于成本的优化,其中一个明显的计划总是最优的。在这种情况下不会发生统计信息更新。
请参阅 Greg Low 的 Microsoft 白皮书计划缓存和重新编译 SQL Server 2012。