Ho due query t-sql usando SqlServer 2005. Come posso misurare quanto tempo impiega ciascuna a funzionare?
L'uso del mio cronometro non lo taglia.
Ho due query t-sql usando SqlServer 2005. Come posso misurare quanto tempo impiega ciascuna a funzionare?
L'uso del mio cronometro non lo taglia.
Risposte:
Un approccio semplicistico alla misurazione del "tempo trascorso" tra gli eventi è quello di prendere semplicemente la data e l'ora correnti.
In SQL Server Management Studio
SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ;
SELECT GETDATE();
Per calcolare i tempi trascorsi, è possibile acquisire quei valori di data in variabili e utilizzare la funzione DATEDIFF:
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;
Questo è solo un approccio. È inoltre possibile ottenere tempi trascorsi per le query utilizzando SQL Profiler.
SET @t1 = GETDATE();nella parte superiore della mia query e quindi incolla SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();in punti ragionevoli all'interno della query (modificando "NOTA 1" in modo appropriato). Trattare le selezioni come punti di interruzione piuttosto che misurazioni è semanticamente identico al proprio approccio (sebbene il set finale su @ t1 sia spurio e questo presuppone che tutte le query debbano essere misurate). Questa è puramente un'ottimizzazione mentale / tipizzante (un incolla per breakpoint, anziché due paste per query).
Se vuoi una misurazione più accurata della risposta sopra:
set statistics time on
-- Query 1 goes here
-- Query 2 goes here
set statistics time off
I risultati saranno nella finestra Messaggi .
Aggiornamento (29/07/2015):
A grande richiesta, ho scritto uno snippet di codice che è possibile utilizzare per eseguire un'intera procedura memorizzata anziché i suoi componenti. Anche se questo restituisce solo il tempo impiegato dall'ultima corsa, ci sono ulteriori statistiche restituite sys.dm_exec_procedure_statsche possono anche essere di valore:
-- 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. da: 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]
Un altro modo consiste nell'utilizzare una funzionalità integrata di SQL Server denominata Client Statisticsaccessibile tramite Menu> Query> Includi statistiche client .
È possibile eseguire ciascuna query in una finestra di query separata e confrontare i risultati forniti nella Client Statisticsscheda accanto alla Messagesscheda.
Ad esempio, nell'immagine seguente mostra che il tempo medio trascorso per ottenere la risposta del server per una delle mie query è di 39 millisecondi.
Puoi leggere tutti e 3 i modi per acquisire i tempi di esecuzione qui . Potrebbe anche essere necessario visualizzare Estimated Execution Plan ctrlLper ulteriori indagini sulla query.
ancora meglio, questo misurerà la media di n iterazioni della tua query! Ottimo per una lettura più accurata.
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
MICROSECONDdi MILLISECONDe per cancellare la cache di ogni ho inserito seguenti linee tra begine declare @t0 ...: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;. Funziona come il fascino e esattamente quello che stavo cercando. +1
Fare clic sull'icona Statistiche per visualizzare, quindi eseguire la query per ottenere i tempi e sapere quanto è efficiente la query