Wie messe ich die Abfrageleistung am besten?

19

Ich habe 2 gespeicherte Prozeduren, wobei die zweite gespeicherte Prozedur eine Verbesserung der ersten ist.

Ich versuche daran zu messen, um wie viel das eine Verbesserung ist.

1 / Messen clock timescheint keine Option zu sein, da ich unterschiedliche Ausführungszeiten bekomme. Schlimmer noch, manchmal (selten, aber es kommt vor) ist die Ausführungszeit der zweiten gespeicherten Prozedur größer als die Ausführungszeit der ersten Prozedur (ich denke, aufgrund der Serverauslastung in diesem Moment).

2 / Include client statisticsliefert auch unterschiedliche Ergebnisse.

3 / DBCC DROPCLEANBUFFERS, DBCC FREEPROCCACHEsind gut, aber die gleiche Geschichte ...

4 / SET STATISTICS IO ONkönnte eine Option sein, aber wie kann ich eine Gesamtbewertung erhalten, da ich viele Tabellen in meine gespeicherten Prozeduren involviert habe?

5 / Include actual execution plankönnte auch eine Option sein. Ich erhalte einen estimated subtreecostWert von 0,3253 für die erste gespeicherte Prozedur und 0,3079 für die zweite. Kann ich sagen, dass die zweite gespeicherte Prozedur 6% schneller ist (= 0.3253 / 0.3079)?

6 / Verwenden Sie das Feld "Reads" von SQL Server Profiler?

Wie kann ich also sagen, dass die zweite gespeicherte Prozedur x% schneller ist als die erste Prozedur, unabhängig von den Ausführungsbedingungen (der Arbeitslast des Servers, dem Server, auf dem diese gespeicherten Prozeduren ausgeführt werden usw.)?

Wie kann ich nachweisen, dass die zweite gespeicherte Prozedur eine bessere Ausführungszeit als die erste gespeicherte Prozedur hat, wenn dies nicht möglich ist?

Mihai Bejenariu
quelle

Antworten:

17

Ich verwende gerne das kostenlose SQLQueryStress- Tool, wenn ich ein Vorher- Nachher- Szenario vergleiche. Mit SQLQueryStress können Sie jede gespeicherte Prozedur beliebig oft ausführen und die durchschnittlichen Gesamtstatistiken für alle Ausführungen abrufen.

Beispielsweise könnten Sie jede gespeicherte Prozedur 100 Mal ausführen und dann die Statistiken verwenden, um Ihre Verbesserungen zu sichern. "Über 100 Ausführungen, meine Verbesserungen sparen insgesamt 30 Sekunden und der gespeicherte Prozess führt 1500 weniger Lesevorgänge pro Ausführung aus." Ich denke, Sie haben die Idee.

Wenn der gespeicherte Prozess Parameter enthält, sollten Sie immer überprüfen, ob Ihre Verbesserungen mit vielen verschiedenen Parametersätzen funktionieren. SQLQueryStress macht einige coole Sachen, mit denen Sie Parameter in Ihrer Abfrage ersetzen können, um ein besseres Gesamtbild über die Leistung des gespeicherten Prozesses zu erhalten.

SQLQueryStress-Dokumentation: http://www.datamanipulation.net/sqlquerystress/documentation/documentation.asp

SQLQueryStress

GoodwinSQL
quelle
6

4 / Sie können zu http://statisticsioparser.com/statisticsioparser/ gehen und Ihre Statistiken einfügen, um die Gesamtpunktzahl zu sehen.

Nelson G
quelle
Logische Lesevorgänge: 3101 vs. 2943. Vorauslesevorgänge: 0 vs. 8. Anzahl der Scans: 637 insgesamt. Physische liest: 0 insgesamt. LOB Logical Reads: 156 insgesamt.
Mihai Bejenariu
3

Wenn Sie Ausführungszeiten für Ihre beiden gespeicherten Prozeduren über ein paar Tage gesammelt haben, empfehle ich Ihnen, diese Homepage zu verwenden

http://www.evanmiller.org/ab-testing/t-test.html

um zu sehen, ob sie tatsächlich unterschiedlich sind.

6% Unterschied klingt weniger, wenn es um Verbesserungen von gespeicherten Prozeduren geht. Ich erwarte von meinem Kollegen zwei Größenordnungen und gebe vor, enttäuscht zu sein, wenn er nur eine Größenordnung erreicht ...

Er muss die EvanMiller-Homepage nicht verwenden, um zu beweisen, dass seine Lösung schneller funktioniert.

Ich würde auch SQLSentrys (edit :) Plan Explorer von http://www.sqlsentry.com/ installieren, da dies ein viel verbessertes Tool zum Vergleichen von Ausführungsplänen ist.

Henrik Staun Poulsen
quelle