Eu tenho duas consultas t-sql usando o SqlServer 2005. Como posso medir quanto tempo leva para cada uma ser executada?
Usar o cronômetro não é suficiente.
Eu tenho duas consultas t-sql usando o SqlServer 2005. Como posso medir quanto tempo leva para cada uma ser executada?
Usar o cronômetro não é suficiente.
Respostas:
Uma abordagem simplista para medir o "tempo decorrido" entre os eventos é apenas pegar a data e hora atuais.
No SQL Server Management Studio
SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ;
SELECT GETDATE();
Para calcular os tempos decorridos, você pode capturar esses valores de data em variáveis e usar a função 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;
Essa é apenas uma abordagem. Você também pode obter tempos decorridos para consultas usando o SQL Profiler.
SET @t1 = GETDATE();
a parte superior da minha consulta e SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();
colo em pontos criteriosos da consulta (editando "NOTA 1" adequadamente). Tratar as seleções como pontos de interrupção em vez de medições é semanticamente idêntico à sua abordagem (embora o conjunto final para @ t1 seja espúrio e isso pressuponha que todas as consultas devam ser medidas). Isso é puramente uma otimização mental / de digitação (uma pasta por ponto de interrupção, em vez de duas pastas por consulta).
Se você deseja uma medida mais precisa do que a resposta acima:
set statistics time on
-- Query 1 goes here
-- Query 2 goes here
set statistics time off
Os resultados estarão na janela Mensagens .
Atualização (29/07/2015):
Por solicitação popular, escrevi um trecho de código que você pode usar para cronometrar a execução de um procedimento armazenado inteiro, em vez de seus componentes. Embora isso retorne apenas o tempo gasto na última execução, há estatísticas adicionais retornadas sys.dm_exec_procedure_stats
que também podem ter valor:
-- 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.
from: 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]
Outra maneira é usar um recurso interno do SQL Server chamado Client Statistics
acessível através de Menu> Consulta> Incluir Estatísticas do Cliente .
Você pode executar cada consulta na janela de consulta separada e comparar os resultados fornecidos na Client Statistics
guia ao lado da Messages
guia.
Por exemplo, na imagem abaixo, mostra que o tempo médio decorrido para obter a resposta do servidor para uma de minhas consultas é de 39 milissegundos.
Você pode ler todas as três maneiras de adquirir tempo de execução aqui . Pode ser necessário exibi-lo Estimated Execution Plan
ctrlLpara uma investigação mais aprofundada sobre sua consulta.
melhor ainda, isso medirá a média de n iterações da sua consulta! Ótimo para uma leitura mais 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
que MILLISECOND
e para limpar o cache de cada vez que eu inseri seguinte linhas entre begin
e declare @t0 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Funciona como charme e exatamente o que eu estava procurando. 1
Clique no ícone Estatísticas para exibir e, em seguida, execute a consulta para obter os horários e saber a eficiência da sua consulta.