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).
Führen Sie den UPDATE STATISTICS
Befehl aus.
UPDATE STATISTICS dbo.StatTest WITH ROWCOUNT=10000000;
... und der Plan sieht jetzt so aus, jetzt mit einer Schätzung von 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 RESAMPLE
und 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.