Las estadísticas de actualización automática no actualizan las estadísticas

8

Estoy usando SQL SERVER 2012tengo mi Auto Update Stats ON en mi base de datos.

Desde el siguiente enlace aprendí que, las estadísticas de Actualización automática se activarán por cada SQRT(1000 * Table rows)cambio en las filas de la tabla. https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/

Creé una tabla con 1000 registros

SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                name
INTO   stst
FROM   sys.objects 

Creando estadísticas

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Comprobación de las estadísticas creadas

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

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

Según la fórmula

select SQRT(1000 * 500) -- 707.106781186548

Entonces, si agrego / modifico 707.106781186548registros en mi tabla, las estadísticas de actualización automática deberían dispararse

Agregar 1000más registros a mi tabla que deberían ser más que suficientes para dispararauto update stats

INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                a.name
FROM   sys.objects a 

Para disparar el auto update stats

Select * from stst

Comprobando las estadísticas

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

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

Lamentablemente todavía Rowses el 500único.

Incluso después de insertar 1000registros en mi tabla, que obviamente es mayor que 707.106781186548mientras realizaba, SELECT¿por qué las estadísticas de Actualización automática no se activaron? Que me estoy perdiendo aqui

P ரதீப்
fuente
77
Te estás perdiendo un par de cosas. El cálculo mejorado solo se usa en versiones anteriores a 2016 si tiene activado el Indicador de seguimiento 2371. Las estadísticas no se actualizan cuando se modifican los datos, se actualizan después de que se modifican los datos y una consulta necesita usarlos (suponiendo que hayan alcanzado el umbral de modificación).
Erik Darling
77
Además, una consulta trivial (por ejemplo, SELECT * sin una cláusula WHERE) no activará una actualización de estadísticas. Intente ejecutar una consulta que realmente haga que el motor haga algo donde las estadísticas puedan ser útiles (por ejemplo, Igualdad o rango en la columna de la tecla principal).
Aaron Bertrand
2
@sp_BlitzErik Gracias por la información sobre Trace Flag nunca se sabe eso ..
P ரதீப்
3
No se sienta estúpido, aprendí algo de las respuestas a su pregunta. Y acepto que @sp_BlitzErik y / o AaronBertrand deberían publicar sus respuestas.
SqlZim
8
Dejaré que @AaronBertrand publique la suya como respuesta. Podía usar los puntos.
Erik Darling

Respuestas:

11

El nuevo cálculo solo se usa si el indicador de traza 2371 está habilitado, excepto en SQL Server 2016 cuando el nivel de compatibilidad de la base de datos contextual se establece en 130, donde es el comportamiento predeterminado. Ver Microsoft KB 2754171:

Control del comportamiento de Autostat (AUTO_UPDATE_STATISTICS) en SQL Server

Las estadísticas no se actualizan cuando se modifican los datos. Se activa una actualización de estadísticas cuando la optimización basada en costos encuentra que las estadísticas interesantes para la consulta están obsoletas.

El optimizador no ingresa la optimización basada en costos para consultas muy simples ("triviales"), donde un único plan obvio es siempre óptimo. No se producen actualizaciones estadísticas en ese escenario.

Consulte el Libro blanco de Microsoft Plan Caché y recompilación en SQL Server 2012 por Greg Low.

Paul White 9
fuente