2012-07-26 16 views
99

Tengo dos consultas t-sql usando SqlServer 2005. ¿Cómo puedo medir cuánto tiempo lleva ejecutar cada una?Mida el tiempo que lleva ejecutar una consulta t-sql

El uso de mi cronómetro no lo corta.

+2

¿Está utilizando Sql Server Management Studio? En general, muestra el tiempo transcurrido para cada consulta, aunque solo con una segunda resolución. También vea esta pregunta relacionada: http://stackoverflow.com/questions/8247587/sql-server-management-studio-how-to-get-execution-time-down-to-milliseconds – mellamokb

+0

@mellamokb: Estoy usando sms. La segunda resolución es demasiado grosera. – TheMoot

+0

@LittleBobbyTables: Estoy corriendo en sms. ¿Cómo uso una parada? – TheMoot

Respuesta

100

Un enfoque simplista para medir el "tiempo transcurrido" entre eventos es simplemente capturar la fecha y la hora actuales.

En SQL Server Management Studio

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

para calcular los tiempos transcurridos, se pudiera tomar esos valores de fecha en variables, y utilizar la función 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; 

eso es sólo una aproximación. También puede obtener tiempos transcurridos para consultas utilizando el Analizador de SQL.

+0

Busqué Sql Profiler doc sobre cómo hacer esto pero no pude encontrar el documento que no requirió horas de lectura. ¿Me puede recomendar un enlace "Profiler for Dummies"? – TheMoot

+0

@TheMoot Sé que llego tarde pero los enlaces de MSDN son perfectos para sus necesidades de "[Subject] for Dummies" :). Intente echar un vistazo a esto [Cómo: Usar el Analizador de SQL] (https://msdn.microsoft.com/en-us/library/ff650699.aspx) –

+0

¿Alguien más ha tenido problemas con el uso de este en el estudio de administración sql? Lo agregué a un conjunto de aproximadamente 15 consultas en un procedimiento almacenado para probar y lleva demasiado tiempo ejecutarlo. Cancelé a los 7 minutos y todos los temporizadores sumados fueron de solo 2 minutos. Así que creo que hay algún problema con el caché de texto devuelto o que puede llevar demasiado tiempo calcular todos los dateiffs para tantos. –

170

Si desea una medición más precisa que la respuesta anterior:

set statistics time on 

-- Query 1 goes here 

-- Query 2 goes here 

set statistics time off 

Los resultados estarán en los mensajes ventana.

Actualización (07/29/2015):

Por petición popular, he escrito un fragmento de código que puede utilizar a tiempo toda una carrera procedimiento almacenado, en lugar de sus componentes. Aunque esto sólo devuelve el tiempo empleado por la última ejecución, hay estadísticas adicionales devueltos por sys.dm_exec_procedure_stats que también pueden ser de utilidad:

-- 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 tenga en cuenta que esta función no está disponible si su acceso a la base de datos es de solo lectura. 'Para usar SET STATISTICS TIME, los usuarios deben tener los permisos adecuados para ejecutar la instrucción de Transact-SQL. El permiso SHOWPLAN no es obligatorio. desde: http://technet.microsoft.com/en-us/library/ms190287.aspx – Rob

+4

¿Hay alguna manera en la que pueda ver todo el tiempo que un procedimiento almacenado necesita ejecutarse? En este momento veo muchas mediciones individuales. – Rookian

+1

@Rookian, agregué un código a la respuesta para ayudarte con eso. –

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

Eso da el tiempo en nanosegundos. Milleseconds sería DATEDIFF (MS, @ StartTime, @ EndTime) – d512

6

aún mejor, esto va a medir el promedio de n iteraciones de tu consulta! Ideal para una lectura más precisa.

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

Cambié el 'MICROSECOND' a' MILLISECOND' y para borrar el caché cada vez que inserté las siguientes líneas entre 'begin' y' declare @ t0 ... ': ' CONTROL; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; '. Funciona como el encanto y exactamente lo que estaba buscando. +1 –

+1

He estado usando yr snippet para medir ajustes de rendimiento incrementales en un procedimiento almacenado, ¡muy ingenioso! – JayJay

+0

Gracias a los dos. He estado haciendo sql durante mucho tiempo, es un lenguaje peculiar. Pero una vez que sabes cuáles son los problemas y cómo girarlos para tu ventaja, bueno, eso ayuda mucho XD – HumbleWebDev

Cuestiones relacionadas