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

37voto

gbn Punkte 407102

Der Profiler-Trace verdeutlicht dies.

  • Abfrage A: 1,3 Sekunden CPU, 1,4 Sekunden Dauer
  • Abfrage B: 2,3 Sekunden CPU, 1,2 Sekunden Dauer

Die Abfrage B verwendet Parallelität: CPU > Dauer z. B. verwendet die Abfrage 2 CPUs, die im Durchschnitt jeweils 1,15 Sekunden benötigen

Abfrage A ist wahrscheinlich nicht: CPU < Dauer

Dies erklärt die Kosten im Verhältnis zur Charge: 17 % der Kosten für den einfacheren, nicht-parallelen Abfrageplan.

Der Optimierer stellt fest, dass die Abfrage B teurer ist und von der Parallelität profitiert, auch wenn dies zusätzlichen Aufwand bedeutet.

Bedenken Sie jedoch, dass Abfrage B etwa eine Sekunde lang 100 % von 2 CPUS (also 50 % bei 4 CPUs) nutzt. Abfrage A nutzt 100 % einer einzelnen CPU für 1,5 Sekunden.

Der Spitzenwert für Abfrage A ist niedriger, auf Kosten einer längeren Dauer. Wen interessiert das schon bei einem Nutzer? Bei 100 macht es vielleicht einen Unterschied...

16voto

Aditya Acharya Punkte 375
SET STATISTICS TIME ON

SELECT * 

FROM Production.ProductCostHistory
WHERE StandardCost < 500.00;

SET STATISTICS TIME OFF;

Auf der Registerkarte "Nachricht" sieht es dann so aus:

SQL Server Execution Times:

   CPU time = 0 ms,  elapsed time = 10 ms.

(778 row(s) affected)

SQL Server parse and compile time: 

   CPU time = 0 ms, elapsed time = 0 ms.

6voto

Quassnoi Punkte 396418

Die Ergebnisse der Ausführungszeit stehen im direkten Widerspruch zu den Ergebnissen der Abfragekosten, aber ich habe Schwierigkeiten herauszufinden, was "Abfragekosten" eigentlich bedeutet.

Query cost ist die Einschätzung des Optimierers, wie lange Ihre Abfrage dauern wird (im Verhältnis zur Gesamtbatchzeit).

Der Optimierer versucht, den optimalen Abfrageplan auszuwählen, indem er sich Ihre Abfrage und die Statistiken Ihrer Daten ansieht, mehrere Ausführungspläne ausprobiert und den kostengünstigsten davon auswählt.

Hier können Sie im Detail nachlesen, wie sie dies zu tun versucht.

Wie Sie sehen können, kann dies erheblich von dem abweichen, was Sie tatsächlich erhalten.

Der einzige wirkliche Maßstab für die Abfrageleistung ist natürlich, wie lange die Abfrage tatsächlich dauert.

5voto

NMK Punkte 51

Verwenden Sie SET STATISTICS TIME ON

über Ihrer Anfrage.

Unter der Registerkarte "Ergebnis" befindet sich eine Registerkarte "Nachricht". Dort können Sie die Uhrzeit sehen.

3voto

Ausführungszeit der Abfrage:

DECLARE @EndTime datetime
DECLARE @StartTime datetime 
SELECT @StartTime=GETDATE() 

` -- Write Your Query`

SELECT @EndTime=GETDATE()
--This will return execution time of your query
SELECT DATEDIFF(MILLISECOND,@StartTime,@EndTime) AS [Duration in millisecs] 

Query Out Put wird wie:

enter image description here

So optimieren Sie die Abfragekosten :

Klicken Sie auf Ihr SQL Management Studio

enter image description here

Führen Sie Ihre Abfrage aus und klicken Sie auf Ausführungsplan neben der Registerkarte Meldungen Ihres Abfrageergebnisses. Sie sehen dann

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