MS SQL-Server

Knowledge Base

MS SQL-Server > Lösungen, Rezepte, Tipps, Fragen

Wie kann man den Plan Cache und den Ladepuffer zurücksetzen?

Bei der Überprüfung der Performance einer Abfrage ist es manchmal notwendig, die gecachten Ausführungspläne und auch den Ladepuffer zurückzusetzen, um die Performance von zwei Abfragen mit einander besser vergleichen zu können (wenn nur die Gesamtladezeit im worst case betrachtet wird, d. h. wenn Abfrageplan erstellt und die Daten von der Platte geladen werden müssen).

Hierzu werden folgende zwei Befehle eingesetzt:

  • DBCC FREEPROCCACHE: Ohne Parameter werden hier alle Abfrage-Pläne auf dem Server zurückgesetzt (sollte ohne weiteres Studium der zusätzlichen Parameter und Auswirkungen nicht produktiv eingesetzt werden, weil sonst die Performance kurzfristig sinken kann)
  • DBCC DROPCLEANBUFFERS: Hiermit wird der Lade-Cache zurückgesetzt (d. h. etwaige Seiten, die in vorherigen Statements geladen wurden, werden aus dem Cache entfernt und müssen bei der nächsten Abfrage neu geladen werden)

Beispiel (zum Testen):

SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
SET NOCOUNT ON;
 
CREATE TABLE TestTable
(
    ID INT NOT NULL,
    T NVARCHAR(MAX)
);
 
DECLARE @i INT;
SET @i = 0;
WHILE (@i < 1000000)
BEGIN
    INSERT INTO TestTable VALUES (@i, CAST (@i AS NVARCHAR(MAX)));
 
    SET @i = @i + 1;
END;
 
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
 
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
 
SELECT COUNT(*) FROM TestTable WHERE ID % 7 = 0;
SELECT COUNT(*) FROM TestTable WHERE ID % 7 = 0;
 
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
 
SELECT COUNT(*) FROM TestTable WHERE ID % 7 = 0;