Tengo dos consultas t-sql con SqlServer 2005. ¿Cómo puedo medir el tiempo que tarda cada una en ejecutarse?
Usar mi cronómetro no es suficiente.
Tengo dos consultas t-sql con SqlServer 2005. ¿Cómo puedo medir el tiempo que tarda cada una en ejecutarse?
Usar mi cronómetro no es suficiente.
Respuestas:
Un enfoque simplista para medir el "tiempo transcurrido" entre eventos es tomar la fecha y 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, puede tomar esos valores de fecha en variables y usar 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;
Ese es solo un enfoque. También puede obtener los tiempos transcurridos para las consultas con SQL Profiler.
SET @t1 = GETDATE();
en la parte superior de mi consulta y luego pego en SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();
puntos juiciosos dentro de la consulta (editando "NOTA 1" adecuadamente). Tratar las selecciones como puntos de interrupción en lugar de mediciones es semánticamente idéntico a su enfoque (aunque el conjunto final en @ t1 es falso, y esto supone que todas las consultas deben medirse). Esto es puramente una optimización mental / de escritura (una pasta por punto de interrupción, en lugar de dos pastas por consulta).
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 la ventana Mensajes .
Actualización (29/07/2015):
Por solicitud popular, he escrito un fragmento de código que puede usar para cronometrar la ejecución de un procedimiento almacenado completo, en lugar de sus componentes. Aunque esto solo devuelve el tiempo que tomó la última ejecución, hay estadísticas adicionales devueltas sys.dm_exec_procedure_stats
que también pueden ser valiosas:
-- 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.
de: 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]
Otra forma es usar una característica incorporada de SQL Server llamada a la Client Statistics
que se puede acceder a través de Menú> Consulta> Incluir estadísticas del cliente .
Puede ejecutar cada consulta en una ventana de consulta separada y comparar los resultados que se dan en la Client Statistics
pestaña junto a la Messages
pestaña.
Por ejemplo, en la imagen a continuación, muestra que el tiempo promedio transcurrido para obtener la respuesta del servidor para una de mis consultas es de 39 milisegundos.
Puede leer las 3 formas de adquirir tiempo de ejecución aquí . Es posible que incluso necesite mostrar Estimated Execution Plan
ctrlLpara una mayor investigación sobre su consulta.
¡aún mejor, esto medirá el promedio de n iteraciones de su consulta! Genial 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
MICROSECOND
a MILLISECOND
y para borrar la memoria caché cada vez que me inserta siguiendo líneas entre begin
y declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Funciona como encanto y exactamente lo que estaba buscando. +1
Haga clic en el icono de Estadísticas para mostrar y luego ejecutar la consulta para obtener los tiempos y saber qué tan eficiente es su consulta