2012-07-26 17 views
99

Ho due query t-sql che utilizzano SqlServer 2005. Come posso misurare quanto tempo impiega a ciascuna di esse?Misurare il tempo necessario per eseguire una query t-sql

L'utilizzo del cronometro non lo taglia.

+2

Si sta utilizzando Sql Server Management Studio? Generalmente visualizza il tempo trascorso per ogni query, anche se solo con la seconda risoluzione. Vedi anche questa domanda correlata: http://stackoverflow.com/questions/8247587/sql-server-management-studio-how-to-get-execution-time-down-to-milliseconds – mellamokb

+0

@mellamokb: Sto usando ssms. La seconda risoluzione è troppo grossolana. – TheMoot

+0

@LittleBobbyTables: sono in esecuzione in ssms. come posso usare una fermata? – TheMoot

risposta

100

Un approccio semplicistico per misurare il "tempo trascorso" tra gli eventi consiste nel prendere 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, si potrebbe afferrare 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 di attesa per le query utilizzando SQL Profiler.

+0

Ho cercato il documento Sql Profiler su come eseguire questa operazione, ma non ho trovato documenti che non richiedessero ore di lettura. Puoi consigliare un link "Profiler for Dummies"? – TheMoot

+0

@TheMoot So che sono in ritardo, ma i collegamenti MSDN sono perfetti per i tuoi "[Subject] for Dummies" :). Prova a dare un'occhiata a [How To: Use SQL Profiler] (https://msdn.microsoft.com/en-us/library/ff650699.aspx) –

+0

Qualcun altro ha avuto problemi con l'utilizzo di questo in SQL Studio di gestione? L'ho aggiunto a un set di circa 15 query in una stored procedure per il test e richiede troppo tempo per essere eseguito. Ho annullato a 7 minuti e tutti i timer aggiunti erano solo circa 2 minuti. Quindi penso che ci sia qualche problema con la cache del testo di ritorno o forse ci vuole troppo tempo per calcolare tutti gli appuntamenti per così tanti. –

170

Se si desidera una misurazione più accurata rispetto alla risposta di cui sopra:

set statistics time on 

-- Query 1 goes here 

-- Query 2 goes here 

set statistics time off 

I risultati saranno nelle Messaggi finestra.

Aggiornamento (2015/07/29):

A grande richiesta, ho scritto un frammento di codice che è possibile utilizzare per il tempo di un intero ciclo di stored procedure, piuttosto che i suoi componenti. Anche se questo restituisce solo il tempo impiegato dal l'ultima esecuzione, ci sono le statistiche aggiuntive restituiti da sys.dm_exec_procedure_stats che può 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)[email protected] AND 
     (OBJECT_SCHEMA_NAME(object_id,database_id)[email protected] OR @SchemaName IS NULL) AND 
     (DB_NAME(database_id)[email protected] OR @DbName IS NULL) 
+2

Solo una nota che questa funzione non è disponibile se l'accesso al database è di sola lettura. 'Per utilizzare SET STATISTICS TIME, gli utenti devono disporre delle autorizzazioni appropriate per eseguire l'istruzione Transact-SQL. L'autorizzazione SHOWPLAN non è richiesta. da: http://technet.microsoft.com/en-us/library/ms190287.aspx – Rob

+4

Esiste un modo in cui è possibile vedere tutto il tempo che una stored procedure deve eseguire? In questo momento vedo un sacco di singole misurazioni. – Rookian

+1

@Rookian, ho aggiunto del codice alla risposta per aiutarti. –

8
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(NS,@StartTime,@EndTime) AS [Duration in millisecs] 

You can also See this solution

+6

Questo dà il tempo in nanosecondi. Millesecondi sarebbero DATEDIFF (MS, @ StartTime, @ EndTime) – d512

6

ancora meglio, questo sarà misurare 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 
+2

Ho cambiato il 'MICROSECOND' in' MILLISECOND' e per cancellare la cache ogni volta che ho inserito le seguenti righe tra 'begin' e' declare @ t0 ... ': ' CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; '. Funziona come il fascino e esattamente quello che stavo cercando. +1 –

+1

Ho usato il frammento di yr per misurare le modifiche incrementali delle prestazioni in una procedura memorizzata, molto slick! – JayJay

+0

Grazie a entrambi. Sto facendo sql da molto tempo ormai, è un linguaggio bizzarro. Ma una volta che sai quali sono i nodi e come girarli a tuo vantaggio, beh, aiuta molto XD – HumbleWebDev

Problemi correlati