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.
quelle