Wie erhalte ich eine genaue Abfrageleistung?

9

Ich versuche, die Leistung einer gespeicherten Prozedur zu verbessern. Wenn ich den SP starte, wird er fast sofort beendet, als ob etwas zwischengespeichert wäre. Mir wurde gesagt, dass ich die folgenden zwei SQL-Zeilen verwenden soll, bevor ich den SP in SSMS ausführe:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Wenn ich den SP mit den beiden Codezeilen darüber ausführe, ist der SP in ungefähr 8 Sekunden fertig. Gibt mir dies jedoch wirklich die tatsächliche Ausführungszeit (als würde ich dies von einer Anwendung aus ausführen)? Wie soll ich wissen?

OO
quelle

Antworten:

9

Diese Befehle bewirken zwei Dinge:

  • Leeren Sie den Seitencache, in dem Datenseiten gespeichert sind, die bereits von der Festplatte abgerufen wurden (normalerweise ist der Festplattenzugriff der größte Zeitfaktor in einer Abfrage).
  • Leeren Sie den Abfrageplan-Cache. Dies bedeutet, dass der Server einen neuen Abfrageplan erstellen muss. Dies ist normalerweise nicht signifikant, außer bei sehr hohen Transaktionsvolumina.

Sie erhalten im Grunde eine Zeit, die dem "Worst-Case" -Szenario entspricht - Sie haben gerade den Server neu gestartet und nichts ist im Speicher. Nachfolgende Läufe müssen nicht die Kosten für das Abrufen der Daten von der Festplatte bezahlen, da diese Seiten bereits in den Speicher geladen sind.

Dies ähnelt einer realen Situation - Ihr erster Benutzer, der eine bestimmte Abfrage ausführt, muss wahrscheinlich länger warten als bei nachfolgenden Ausführungen, vorausgesetzt, Sie überprüfen dieselben Daten.

Eine gute Methode, die ich gerne verwende, besteht darin, mehrmals zu laufen und einen Durchschnitt zu ermitteln. Dies ist besonders in einer gemeinsam genutzten Umgebung hilfreich, da Sie nicht die vollständige Kontrolle über gemeinsam genutzte Ressourcen wie tempdb haben.

Sie können diese Befehle auch verwenden, um weitere Informationen darüber zu erhalten, was tatsächlich hinter den Kulissen passiert:

SET STATISTICS IO ON
SET STATISTICS TIME ON

Auf diese Weise erhalten Sie detaillierte Informationen zu Seitenlesevorgängen von der Festplatte (pro Objekt), zu logischen Seitenlesevorgängen, zum Zeitaufwand für die Erstellung eines Plans und zum Zeitaufwand für die Ausführung einer Abfrage.

JNK
quelle
ausgezeichnete Antwort wie gewohnt JNK.
OO
Freue mich zu helfen! Sie stellen zufällig Fragen zu Dingen, mit denen ich mich viel befasst habe. Wenn Sie nach Replikation oder Speicherverwaltung fragen, muss ich nicht viel hinzufügen :)
JNK
2
Ich wusste von SET STATISTICS IO ON, aber ich wusste nie von SET STATISTICS TIME ON. Danke JNK.
Datum
2
Nur zu Ihrer Information: Sie können viele dieser Informationen ohne alle SET-Einstellungen abrufen, indem Sie mit SQL Sentry Plan Explorer aktuelle Pläne erstellen. Und um mehrere (z. B. 5) Läufe zu erhalten, können Sie den Stapel GO 5einfach wie in SSMS beenden. Es ist ein kostenloser Download, ich versuche nicht, Ihnen etwas zu verkaufen. sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand
1
@JNK Nun, sicher, es ist kostenlos, spart Zeit und zeigt Informationen an, die entweder unmöglich oder sehr umständlich sind, um aus Management Studio herauszukommen. Und ich arbeite dort. :-)
Aaron Bertrand