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

Pரத*_*ீப் 8 sql-server statistics sql-server-2012

正在使用我的数据库中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 
Run Code Online (Sandbox Code Playgroud)

创建统计信息

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  
Run Code Online (Sandbox Code Playgroud)

检查创建的统计信息

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500
Run Code Online (Sandbox Code Playgroud)

按照公式

select SQRT(1000 * 500) -- 707.106781186548
Run Code Online (Sandbox Code Playgroud)

因此,如果我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 
Run Code Online (Sandbox Code Playgroud)

开火 auto update stats

Select * from stst
Run Code Online (Sandbox Code Playgroud)

检查统计数据

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500
Run Code Online (Sandbox Code Playgroud)

不幸的是仍然Rows500唯一的。

即使在1000我的表中插入记录后,这显然大于707.106781186548执行时SELECT为什么自动更新统计数据没有触发?我在这里错过了什么

Pau*_*ite 11

新的计算仅在启用跟踪标志 2371 时使用,除非在 SQL Server 2016 上上下文数据库兼容性级别设置为 130,这是默认行为。请参阅 Microsoft 知识库文章 2754171:

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

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

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

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