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.
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.
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.
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
@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) –
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. –
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)
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
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
@Rookian, ho aggiunto del codice alla risposta per aiutarti. –
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]
Questo dà il tempo in nanosecondi. Millesecondi sarebbero DATEDIFF (MS, @ StartTime, @ EndTime) – d512
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
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 –
Ho usato il frammento di yr per misurare le modifiche incrementali delle prestazioni in una procedura memorizzata, molto slick! – JayJay
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
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
@mellamokb: Sto usando ssms. La seconda risoluzione è troppo grossolana. – TheMoot
@LittleBobbyTables: sono in esecuzione in ssms. come posso usare una fermata? – TheMoot