Messen Sie die Zeit, die zum Ausführen einer t-sql-Abfrage benötigt wird


156

Ich habe zwei T-SQL-Abfragen mit SqlServer 2005. Wie kann ich messen, wie lange es dauert, bis jede ausgeführt wird?

Die Verwendung meiner Stoppuhr schneidet nicht.


2
Verwenden Sie SQL Server Management Studio? Im Allgemeinen wird die für jede Abfrage verstrichene Zeit angezeigt, allerdings nur mit zweiter Auflösung. Siehe auch diese verwandte Frage: stackoverflow.com/questions/8247587/…
mellamokb

Antworten:


174

Ein vereinfachter Ansatz zur Messung der "verstrichenen Zeit" zwischen Ereignissen besteht darin, nur das aktuelle Datum und die aktuelle Uhrzeit zu erfassen.

In SQL Server Management Studio

SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ; 
SELECT GETDATE(); 

Um die verstrichenen Zeiten zu berechnen, können Sie diese Datumswerte in Variablen erfassen und die DATEDIFF-Funktion verwenden:

DECLARE @t1 DATETIME;
DECLARE @t2 DATETIME;

SET @t1 = GETDATE();
SELECT /* query one */ 1 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

SET @t1 = GETDATE();
SELECT /* query two */ 2 ;
SET @t2 = GETDATE();
SELECT DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;

Das ist nur ein Ansatz. Mit SQL Profiler können Sie auch verstrichene Zeiten für Abfragen abrufen.


Ich suchte nach einem SQL Profiler-Dokument, um dies zu tun, konnte jedoch kein Dokument finden, für das kein stundenlanges Lesen erforderlich war. Können Sie einen Link "Profiler for Dummies" empfehlen?
TheMoot

@TheMoot Ich weiß, dass ich zu spät bin, aber die MSDN-Links sind perfekt für Ihre "[Subject] for Dummies" -Bedürfnisse :). Versuchen Sie, einen Blick auf diese Anleitung zu werfen : Verwenden Sie SQL Profiler
John Odom

Hat jemand andere Probleme mit der Verwendung in SQL Management Studio? Ich habe es zu einer Reihe von ungefähr 15 Abfragen in einer gespeicherten Prozedur zum Testen hinzugefügt, und die Ausführung dauert viel zu lange. Ich stornierte nach 7 Minuten und alle Timer summierten sich auf nur etwa 2 Minuten. Ich denke, es gibt ein Problem mit dem Rückgabetext-Cache, oder es dauert zu lange, um alle Datumsangaben für so viele zu berechnen.
MH

2
@Hanoncs: Es wird wenig Zeit benötigt, um GETDATE () auszuwerten und das Ergebnis einer Variablen zuzuweisen, und wenig Zeit, um DATEDIFF () auszuwerten und das Ergebnis zurückzugeben. Der vereinfachte Ansatz, den ich vorgeschlagen habe, bestand darin, eine grobe Messung für Singleton-Abfragen zu erhalten. Ich würde nicht empfehlen, diesen Ansatz in einer engen Schleife in einer gespeicherten Prozedur zu verwenden. Wenn ich eine Reihe von Abfragen in einer gespeicherten Prozedur hätte, könnte ich diesen Ansatz verwenden, um an einigen wichtigen Punkten eine Debugging-Ausgabe hinzuzufügen und eine Diskriminatorspalte hinzuzufügen, damit ich weiß, welche Zeile in der Prozedur welches Ergebnis ausgegeben hat.
Spencer7593

1
Normalerweise bleibe ich SET @t1 = GETDATE();am Anfang meiner Abfrage und SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();füge sie dann an wichtigen Stellen in der Abfrage ein (indem ich "ANMERKUNG 1" entsprechend bearbeite). Die Behandlung der Auswahlen als Haltepunkte und nicht als Messungen ist semantisch identisch mit Ihrem Ansatz (obwohl die endgültige Einstellung auf @ t1 falsch ist und dies voraussetzt, dass alle Abfragen gemessen werden sollten). Dies ist lediglich eine mentale / Typisierungsoptimierung (eine Einfügung pro Haltepunkt anstelle von zwei Pasten pro Abfrage).
Brian

251

Wenn Sie eine genauere Messung als die obige Antwort wünschen:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

Die Ergebnisse werden im Nachrichtenfenster angezeigt.

Update (29.07.2015):

Auf vielfachen Wunsch habe ich ein Code-Snippet geschrieben, mit dem Sie die gesamte Ausführung einer gespeicherten Prozedur und nicht deren Komponenten zeitlich festlegen können. Obwohl dies nur die Zeit zurückgibt, die für den letzten Lauf benötigt wurde, werden zusätzliche Statistiken zurückgegeben sys.dm_exec_procedure_stats, die ebenfalls von Wert sein können:

-- Use the last_elapsed_time from sys.dm_exec_procedure_stats
-- to time an entire stored procedure.

-- Set the following variables to the name of the stored proc
-- for which which you would like run duration info
DECLARE @DbName NVARCHAR(128);
DECLARE @SchemaName SYSNAME;
DECLARE @ProcName SYSNAME=N'TestProc';

SELECT CONVERT(TIME(3),DATEADD(ms,ROUND(last_elapsed_time/1000.0,0),0)) 
       AS LastExecutionTime
FROM sys.dm_exec_procedure_stats
WHERE OBJECT_NAME(object_id,database_id)=@ProcName AND
      (OBJECT_SCHEMA_NAME(object_id,database_id)=@SchemaName OR @SchemaName IS NULL) AND
      (DB_NAME(database_id)=@DbName OR @DbName IS NULL)

2
Nur ein Hinweis, dass diese Funktion nicht verfügbar ist, wenn Ihr Zugriff auf die Datenbank schreibgeschützt ist. To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. von: technet.microsoft.com/en-us/library/ms190287.aspx
Rob

5
Gibt es eine Möglichkeit, die gesamte Zeit zu sehen, die eine gespeicherte Prozedur ausführen muss? Im Moment sehe ich viele Einzelmessungen.
Rookian

2
@Rookian, ich habe der Antwort einen Code hinzugefügt, um Ihnen dabei zu helfen.
Michael Goldshteyn

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

 -- Write Your Query


SELECT @EndTime=GETDATE()

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

Sie können diese Lösung auch anzeigen


9
Das gibt die Zeit in Nanosekunden an. Millesekunden wären DATEDIFF (MS, @ StartTime, @ EndTime)
d512

10

Eine andere Möglichkeit ist die Verwendung einer integrierten SQL Server-Funktion mit dem Namen, auf Client Statisticsdie über Menü> Abfrage> Clientstatistik einschließen zugegriffen werden kann .

Sie können jede Abfrage in einem separaten Abfragefenster ausführen und die Ergebnisse vergleichen, die auf der Client StatisticsRegisterkarte direkt neben der MessagesRegisterkarte angezeigt werden.

Das folgende Bild zeigt beispielsweise, dass die durchschnittliche Zeit, die verstrichen ist, um die Serverantwort für eine meiner Abfragen zu erhalten, 39 Millisekunden beträgt.

Ergebnis

Sie können die Ausführungszeit für den Erwerb der in allen 3 Arten lesen Sie hier . Möglicherweise müssen Sie sogar Estimated Execution Plan ctrlLfür weitere Untersuchungen zu Ihrer Abfrage anzeigen .


7

Noch besser, dies misst den Durchschnitt von n Iterationen Ihrer Abfrage! Ideal für eine genauere Ablesung.

declare @tTOTAL int = 0
declare @i integer = 0
declare @itrs integer = 100

while @i < @itrs
begin
declare @t0 datetime = GETDATE()

--your query here

declare @t1 datetime = GETDATE()

set @tTotal = @tTotal + DATEDIFF(MICROSECOND,@t0,@t1)

set @i = @i + 1
end

select @tTotal/@itrs

4
Ich habe den Cache jedes Mal geändert MICROSECOND, MILLISECONDwenn ich die folgenden Zeilen zwischen beginund eingefügt habe declare @t0 ...: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;. Funktioniert wie Charme und genau das, wonach ich gesucht habe. +1
Daniel Z.

1
Ich habe Ihr Snippet verwendet, um inkrementelle Leistungsverbesserungen an einer gespeicherten Prozedur zu messen, sehr geschickt!
JayJay

Danke euch beiden. Ich mache jetzt schon lange SQL, es ist eine skurrile Sprache. Aber sobald Sie wissen, was die Knicke sind und wie Sie sie zu Ihrem Vorteil drehen können, hilft es viel XD
HumbleWebDev

3

Klicken Sie auf das Statistiksymbol, um die Abfrage anzuzeigen und dann auszuführen, um die Timings abzurufen und zu erfahren, wie effizient Ihre Abfrage ist

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.