我正在使用SQL SERVER 2012
,我的数据库中的自动更新统计信息
已经开启。
从下面的链接中我了解到,每当表行数发生变化时,自动更新统计信息将会触发,触发条件为SQRT(1000 * 表行数)
。
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条记录,这应该足够触发自动更新统计信息。
INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
a.name
FROM sys.objects a
解除“自动更新统计信息”功能。
Select * from stst
检查统计数据
DBCC show_statistics('stst', rn) -- Rows 500
DBCC show_statistics('stst', name) -- Rows 500
很不幸,仍然只有500行。
即使在我的表中插入了1000条记录,显然大于707.106781186548,在执行SELECT时为什么自动更新统计信息没有触发?我在这里漏掉了什么?