自动更新统计信息不更新统计信息


8

我用SQL SERVER 2012我有我Auto Update Stats 我的数据库。

从下面的链接中,我了解到,对于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

不幸的是仍然Rows500唯一的。

即使在将1000记录插入到我的表中之后,这显然比707.106781186548执行记录时还要大,SELECT为什么自动更新统计信息没有触发?我在这里想念什么


7
您错过了几件事。如果启用了跟踪标记2371,则改进的计算仅在2016年之前的版本中使用。统计信息不会在修改数据时更新,而是在修改数据后更新,并且查询需要使用它们(假设它们已达到修改阈值)。
Erik Darling

7
琐碎的查询(例如,不带WHERE子句的SELECT *)也不会触发统计信息更新。尝试运行一个查询,该查询实际上使引擎执行可能需要使用统计信息的操作(例如,“相等”或前导键列上的范围)。
阿龙贝特朗

2
@sp_BlitzErik感谢您提供有关Trace Flag的信息,从不知道..
Pரதீப்2016年

3
别傻了,我从您问题的答案中学到了一些东西。我同意@sp_BlitzErik和/或AaronBertrand应该发布他们的答案。
SqlZim

8
我让@AaronBertrand发布他作为答案。他可以使用这些点。
Erik Darling

Answers:


11

仅当启用了跟踪标志2371时才使用新的计算,但在上下文数据库兼容性级别设置为130(这是默认行为)的SQL Server 2016上除外。请参阅Microsoft KB 2754171:

在SQL Server中控制Autostat(AUTO_UPDATE_STATISTICS)行为

修改数据后不会更新统计信息。当基于成本的优化发现查询的有趣统计信息已过时时,将触发统计信息更新。

对于非常简单(“琐碎”)的查询,优化器不会输入基于成本的优化,在这种情况下,一个显而易见的计划始终是最佳的。在这种情况下不会发生任何统计信息更新。

请参阅Greg Low 撰写的Microsoft白皮书SQL Server 2012中计划缓存和重新编译

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.