Comment réinitialiser les statistiques après METTRE À JOUR LES STATISTIQUES… AVEC ROWCOUNT

11

À des fins de réglage et de test des requêtes, vous pouvez affecter manuellement un nombre de lignes et un nombre de pages aux statistiques d'index d'une table en exécutant UPDATE STATISTICS. Mais comment recalculer / réinitialiser les statistiques au contenu réel de la table?

--- 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;

Une requête factice:

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

... renverra le plan de requête suivant (l'estimation de ligne dans l'index Scan est de 1024 lignes).

10 000 rangées

Exécutez la UPDATE STATISTICScommande ..

UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;

... et le plan ressemble à ceci, maintenant avec une estimation de 10 millions de lignes:

10 millions de lignes

Comment réinitialiser le nombre de lignes au contenu réel de la table sans utiliser WITH ROWCOUNT?

J'ai essayé WITH FULLSCAN, WITH RESAMPLEet WITH SAMPLE n ROWS, mais le nombre de lignes statistiques reste de 10 millions de lignes. L'insertion d'une ligne ou même la suppression de toutes les lignes ne met pas à jour les statistiques, car la modification est trop faible.

Daniel Hutmacher
la source

Réponses:

15

À utiliser DBCC UPDATEUSAGEavec l' COUNT_ROWSoption.

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

Documentation

Paul White 9
la source