Ich versuche, die relative Leistung von zwei verschiedenen Abfragen zu bestimmen, und habe zwei Möglichkeiten, dies zu messen:
1. Führen Sie beide Abfragen aus und messen Sie die Zeit
2. Beide ausführen und "Abfragekosten" aus dem aktuellen Ausführungsplan ermitteln
Hier ist der Code, mit dem ich die Abfragen zeitlich einstelle...
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO
Ich erhalte die folgende Meldung:
Stored_Proc Execution_Time Query Cost (Relative To Batch)
test_1a 1.673 seconds 17%
test_1b 1.033 seconds 83%
Die Ergebnisse der Ausführungszeit stehen im direkten Widerspruch zu den Ergebnissen der Abfragekosten, aber ich habe Schwierigkeiten herauszufinden, was "Abfragekosten" eigentlich bedeuten. Meine beste Vermutung ist, dass es sich um ein Aggregat aus Reads/Writes/CPU_Time/etc handelt, daher habe ich einige Fragen:
-
Gibt es eine eindeutige Quelle, die erklärt, was diese Maßnahme bedeutet?
-
Welche anderen "Query Performance"-Metriken werden verwendet, und was sind ihre relativen Vorzüge?
Es ist vielleicht wichtig zu wissen, dass es sich um einen mittelgroßen SQL Server handelt, auf dem MS SQL Server 2005 auf MS Server 2003 Enterprise Edition mit mehreren Prozessoren und mehr als 100 gleichzeitigen Benutzern läuft.
EDITAR:
Nach einigen Mühen ist es mir gelungen, Profiler-Zugriff auf diesen SQL-Server zu erhalten, und ich kann zusätzliche Informationen geben (was dafür spricht, dass die Abfragekosten mit den Systemressourcen zusammenhängen, nicht mit der Ausführungszeit selbst...)
Stored_Proc CPU Reads Writes Duration
test_1a 1313 3975 93 1386
test_1b 2297 49839 93 1207
Beeindruckend, dass die Aufnahme von mehr CPUs mit VIEL mehr Reads weniger Zeit benötigt :)