2012-07-26 2 views
99

У меня есть два запроса t-sql с использованием SqlServer 2005. Как я могу определить, сколько времени потребуется для каждого из них?Измерьте время, необходимое для выполнения запроса t-sql

Использование моего секундомера не разрезает его.

+2

Вы используете Sql Server Management Studio? Он обычно отображает время, прошедшее для каждого запроса, хотя и только со вторым разрешением. Также см. Этот связанный вопрос: http://stackoverflow.com/questions/8247587/sql-server-management-studio-how-to-get-execution-time-down-to-milliseconds – mellamokb

+0

@mellamokb: Я использую ssms. Второе разрешение слишком грубое. – TheMoot

+0

@LittleBobbyTables: Я бегу в ssms. как использовать остановку? – TheMoot

ответ

100

Один упрощенный подход к измерению «прошедшего времени» между событиями - просто захватить текущую дату и время.

В среде SQL Server Management Studio,

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

Чтобы вычислить истекшее время, вы могли бы захватить эти значения даты в переменные, а также использовать функцию 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; 

Это только один подход. Вы также можете получить истекшее время для запросов с помощью SQL Profiler.

+0

Я искал Sql Profiler doc о том, как это сделать, но не смог найти документ, который не требовал часов чтения. Можете ли вы порекомендовать ссылку «Профайлер для чайников»? – TheMoot

+0

@ TheMoot Я знаю, что я опаздываю, но ссылки MSDN идеально подходят для ваших нужд [Тема] для «чайников» :). Попробуйте взглянуть на это [Как использовать SQL Profiler] (https://msdn.microsoft.com/en-us/library/ff650699.aspx) –

+0

У кого-нибудь еще были проблемы с использованием этого в студии управления sql? Я добавил его в набор из примерно 15 запросов в хранимой процедуре для тестирования, и он слишком долго запускается. Я отменил через 7 минут, и все таймеры добавили всего около 2 минут. Поэтому я думаю, что есть некоторые проблемы с возвратом текстового кэша, или, может быть, слишком много времени, чтобы рассчитать все датфиксы для стольких. –

170

Если вы хотите получить более точные измерения, чем выше ответ:

set statistics time on 

-- Query 1 goes here 

-- Query 2 goes here 

set statistics time off 

Результаты будут в сообщения окно.

Update (2015-07-29):

По многочисленным просьбам я написал фрагмент кода, который вы можете использовать, чтобы время всю хранимую процедуру выполнения, а не его компонентов. Хотя это только возвращает время, затраченное на последнем прогон, есть дополнительные статистики возвращаемых sys.dm_exec_procedure_stats, которые также могут иметь ценность:

-- 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

Просто обратите внимание, что эта функция недоступна, если ваш доступ к базе данных доступен только для чтения. 'Чтобы использовать SET STATISTICS TIME, пользователи должны иметь соответствующие разрешения для выполнения инструкции Transact-SQL. Разрешение SHOWPLAN не требуется. от: http://technet.microsoft.com/en-us/library/ms190287.aspx – Rob

+4

Есть ли способ, которым я могу видеть все время, которое должна выполняться хранимой процедурой? Сейчас я вижу много отдельных измерений. – Rookian

+1

@Rookian, я добавил код для ответа, чтобы помочь вам в этом. –

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

Это дает время в наносекундах. Миллсекунды будут DATEDIFF (MS, @ StartTime, @ EndTime) – d512

6

еще лучше, это будет измерять среднее n итераций вашего запроса! Отлично подходит для более точного чтения.

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

Я изменил 'MICROSECOND' на' MILLISECOND' и очистил кеш каждый раз, когда я вставил следующие строки между 'begin' и' declare @ t0 ... ': ' КОНТРОЛЬНО-ПРОПУСКНОЙ ПУНКТ; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; '. Работает как очарование и именно то, что я искал. +1 –

+1

Я использую yr snippet для оценки инкрементных настроек производительности в хранимой процедуре, очень гладкий! – JayJay

+0

Спасибо вам обоим. Я занимаюсь sql в течение долгого времени, его причудливый язык. Но как только вы знаете, что такое перегибы и как их открутить в свою пользу, хорошо это помогает много XD – HumbleWebDev

Смежные вопросы