54 Stimmen

Messung der Abfrageleistung: "Ausführungsplan-Abfragekosten" vs. "benötigte Zeit"

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:

  1. Gibt es eine eindeutige Quelle, die erklärt, was diese Maßnahme bedeutet?

  2. 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 :)

2voto

LCJ Punkte 21809

Ich verstehe, dass dies eine alte Frage ist, aber ich möchte ein Beispiel hinzufügen, bei dem die Kosten gleich sind, aber eine Abfrage besser ist als die andere.

Wie Sie in der Frage festgestellt haben, ist der im Ausführungsplan angezeigte Prozentsatz nicht der einzige Maßstab für die Bestimmung der besten Abfrage. Im folgenden Beispiel habe ich zwei Abfragen, die die gleiche Aufgabe erfüllen. Der Ausführungsplan zeigt, dass beide gleich gut sind (jeweils 50%). Nun habe ich die Abfragen ausgeführt mit SET STATISTICS IO ON die deutliche Unterschiede aufweisen.

In dem folgenden Beispiel verwendet die Abfrage 1 seek während bei Abfrage 2 scan in der Tabelle LWManifestOrderLineItems. Bei der Überprüfung der Ausführungszeit zeigt sich jedoch, dass Abfrage 2 besser funktioniert.

Lesen Sie auch Wann ist ein Suchvorgang kein Suchvorgang? von Paul White

ABFRAGE

---Preparation---------------
-----------------------------
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO

SET STATISTICS IO ON  --IO
SET STATISTICS TIME ON

--------Queries---------------
------------------------------

SELECT LW.Manifest,LW.OrderID,COUNT(DISTINCT LineItemID)
FROM LWManifestOrderLineItems LW
INNER JOIN ManifestContainers MC
    ON MC.Manifest = LW.Manifest
GROUP BY LW.Manifest,LW.OrderID
ORDER BY COUNT(DISTINCT LineItemID) DESC  

SELECT LW.Manifest,LW.OrderID,COUNT( LineItemID) LineCount
FROM LWManifestOrderLineItems LW
WHERE LW.Manifest IN (SELECT Manifest FROM ManifestContainers)
GROUP BY LW.Manifest,LW.OrderID
ORDER BY COUNT( LineItemID) DESC  

Statistik IO

enter image description here

Ausführungsplan

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X