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.
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.
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.
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
@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) –
¿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. –
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)
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
¿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
@Rookian, agregué un código a la respuesta para ayudarte con eso. –
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]
Eso da el tiempo en nanosegundos. Milleseconds sería DATEDIFF (MS, @ StartTime, @ EndTime) – d512
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
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 –
He estado usando yr snippet para medir ajustes de rendimiento incrementales en un procedimiento almacenado, ¡muy ingenioso! – JayJay
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
¿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
@mellamokb: Estoy usando sms. La segunda resolución es demasiado grosera. – TheMoot
@LittleBobbyTables: Estoy corriendo en sms. ¿Cómo uso una parada? – TheMoot