Cómo restablecer estadísticas después de ACTUALIZAR ESTADÍSTICAS ... CON ROWCOUNT

11

Para fines de prueba y ajuste de consultas, puede asignar manualmente un recuento de filas y un recuento de páginas a las estadísticas de índice de una tabla mediante la ejecución UPDATE STATISTICS. Pero, ¿cómo recalcula / restablece las estadísticas a los contenidos reales de la tabla?

--- Create a table..
CREATE TABLE dbo.StatTest (
    i      int NOT NULL,
    CONSTRAINT PK_StatTest PRIMARY KEY CLUSTERED (i)
);
GO

--- .. and give it a thousand-or-so rows:
DECLARE @i int=1;
INSERT INTO dbo.StatTest (i) VALUES (@i);

WHILE (@i<1000) BEGIN;
    INSERT INTO dbo.StatTest (i) SELECT @i+i FROM dbo.StatTest;
    SET @i=@i*2;
END;

Una consulta ficticia:

SELECT i%100, COUNT(*) FROM dbo.StatTest GROUP BY i%100;

... devolverá el siguiente plan de consulta (la estimación de filas en el Análisis del índice es de 1024 filas).

10 000 filas

Ejecute el UPDATE STATISTICScomando ...

UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;

... y el plan se ve así, ahora con una estimación de 10 millones de filas:

10 millones de filas

¿Cómo restablezco el conteo de filas al contenido real de la tabla sin usar WITH ROWCOUNT?

Lo he intentado WITH FULLSCAN, WITH RESAMPLEy WITH SAMPLE n ROWS, pero el recuento de filas estadísticas sigue siendo 10 millones de filas. Insertar una fila o incluso eliminar todas las filas no actualiza las estadísticas, porque el cambio es demasiado pequeño.

Daniel Hutmacher
fuente

Respuestas:

15

Usar DBCC UPDATEUSAGEcon la COUNT_ROWSopción.

DBCC UPDATEUSAGE 
(   { database_name | database_id | 0 } 
    [ , { table_name | table_id | view_name | view_id } 
    [ , { index_name | index_id } ] ] 
) [ WITH [ NO_INFOMSGS ] [ , ] [ COUNT_ROWS ] ] 

Documentación

Paul White 9
fuente