So setzen Sie Statistiken nach UPDATE STATISTICS… WITH ROWCOUNT zurück

11

Zu Abfrageoptimierungs- und Testzwecken können Sie der Indexstatistik einer Tabelle manuell eine Zeilen- und Seitenanzahl zuweisen, indem Sie sie ausführen UPDATE STATISTICS. Aber wie berechnet man die Statistiken neu / setzt sie auf den tatsächlichen Inhalt der Tabelle zurück?

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

Eine Dummy-Abfrage:

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

... gibt den folgenden Abfrageplan zurück (die Zeilenschätzung im Index-Scan beträgt 1024 Zeilen).

10 000 Zeilen

Führen Sie den UPDATE STATISTICSBefehl aus.

UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;

... und der Plan sieht jetzt so aus, jetzt mit einer Schätzung von 10 Millionen Zeilen:

10 Millionen Zeilen

Wie setze ich die Zeilenanzahl auf den tatsächlichen Inhalt der Tabelle zurück, ohne sie zu verwenden WITH ROWCOUNT?

Ich habe es versucht WITH FULLSCAN, WITH RESAMPLEund WITH SAMPLE n ROWS, aber die statistische Zeilenanzahl bleibt 10 Millionen Zeilen. Durch das Einfügen einer Zeile oder sogar das Löschen aller Zeilen wird die Statistik nicht aktualisiert, da die Änderung zu gering ist.

Daniel Hutmacher
quelle

Antworten:

15

Verwenden Sie DBCC UPDATEUSAGEmit der 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 ] ] 

Dokumentation

Paul White 9
quelle