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.
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.
Antworten:
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.
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).
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)
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
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]
Eine andere Möglichkeit ist die Verwendung einer integrierten SQL Server-Funktion mit dem Namen, auf Client Statistics
die ü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 Statistics
Registerkarte direkt neben der Messages
Registerkarte 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.
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 .
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
MICROSECOND
, MILLISECOND
wenn ich die folgenden Zeilen zwischen begin
und eingefügt habe declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Funktioniert wie Charme und genau das, wonach ich gesucht habe. +1
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