Bevor Sie einen Leistungstest / eine Baseline für eine App ausführen, die SQL Server verwendet, möchte ich die Instanz in einen "sauberen" Zustand versetzen können, ohne die Instanz neu zu starten. Es gibt Schritte, denen ich tendenziell folge, aber ich möchte eine endgültige Liste erstellen, die in der richtigen Reihenfolge vorliegt und keine redundanten Schritte enthält.
Schafft diese Liste von Schritten das Setzen von SQL Server in einen "sauberen" Zustand?
Ist die Reihenfolge logisch / korrekt?
Gibt es redundante Schritte?
CHECKPOINT -- Write all dirty pages
DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint?
DBCC FREEPROCCACHE -- Clear the plan cache
DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE?
DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want to catch all scenarios
EXEC SP_UPDATESTATS -- Refresh stats
'BEGIN TESTING!'
sql-server
dbcc
performance-testing
cache
Eric Higgins
quelle
quelle
DROPCLEANBUFFERS
ist schön zum Testen, aber nicht immer genau. Wenn Sie auf eine Tabelle mit hohem Volumen verweisen, haben Sie höchstwahrscheinlich fast immer Seiten im Speicher, und die E / A-Zeit spielt bei dieser Abfrage keine große Rolle. Möglicherweise legen Sie mehr Gewicht auf E / A, als in diesem Fall realistisch ist.Antworten:
Zuerst würde ich zurücktreten und fragen, welche Messungen Sie während des Tests sammeln möchten. Wenn Sie beispielsweise logische Lesevorgänge per Abfrage zählen, müssen Sie den Cache nicht freigeben. Ich bin ein großer Fan von logischen Lesevorgängen, da dies unabhängig davon ist, ob die Daten zwischengespeichert oder auf der Festplatte gespeichert sind. In der Produktion ist es schwer zu erraten, ob die Daten einer Abfrage zwischengespeichert werden oder nicht (es sei denn, Sie speichern die gesamte Datenbank im Speicher zwischen). . Wenn Sie die logischen Lesevorgänge minimieren, wird die App schneller ausgeführt, unabhängig davon, ob sich die Daten im Cache befinden oder nicht.
Als nächstes würde ich fragen, was sich zwischen den Läufen ändert. Wenn Sie beispielsweise EXEC SP_UPDATESTATS in jeder Datenbank ausführen, wie Sie vorgeschlagen haben, werden Sie die Statistiken für aktualisierte Tabellen erneut abtasten. Wenn Sie jedoch keine Statistiken mit Fullscan aktualisieren, erhalten Sie zufällige Zeilen aus der Tabelle - das ist nicht zu wiederholbar, und ich glaube nicht, dass Sie das wirklich wollen. Stattdessen möchten Sie möglicherweise die Datenbanken zwischen den einzelnen Läufen wiederherstellen, damit Sie immer genau dieselben Daten testen. Wenn Ihre Tests Einfügungen / Aktualisierungen / Löschungen durchführen, haben sie möglicherweise bei jedem Lauf unterschiedliche Leistungsprofile, wenn Sie die Datenbank nicht wiederherstellen (weil sie Daten hinzufügen / ändern sowie Statistiken zu den Daten ändern) - und noch schlimmer:
quelle