У меня есть два запроса t-sql с использованием SqlServer 2005. Как я могу определить, сколько времени потребуется для каждого из них?Измерьте время, необходимое для выполнения запроса t-sql
Использование моего секундомера не разрезает его.
У меня есть два запроса t-sql с использованием SqlServer 2005. Как я могу определить, сколько времени потребуется для каждого из них?Измерьте время, необходимое для выполнения запроса t-sql
Использование моего секундомера не разрезает его.
Один упрощенный подход к измерению «прошедшего времени» между событиями - просто захватить текущую дату и время.
В среде 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.
Я искал Sql Profiler doc о том, как это сделать, но не смог найти документ, который не требовал часов чтения. Можете ли вы порекомендовать ссылку «Профайлер для чайников»? – TheMoot
@ TheMoot Я знаю, что я опаздываю, но ссылки MSDN идеально подходят для ваших нужд [Тема] для «чайников» :). Попробуйте взглянуть на это [Как использовать SQL Profiler] (https://msdn.microsoft.com/en-us/library/ff650699.aspx) –
У кого-нибудь еще были проблемы с использованием этого в студии управления sql? Я добавил его в набор из примерно 15 запросов в хранимой процедуре для тестирования, и он слишком долго запускается. Я отменил через 7 минут, и все таймеры добавили всего около 2 минут. Поэтому я думаю, что есть некоторые проблемы с возвратом текстового кэша, или, может быть, слишком много времени, чтобы рассчитать все датфиксы для стольких. –
Если вы хотите получить более точные измерения, чем выше ответ:
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)
Просто обратите внимание, что эта функция недоступна, если ваш доступ к базе данных доступен только для чтения. 'Чтобы использовать SET STATISTICS TIME, пользователи должны иметь соответствующие разрешения для выполнения инструкции Transact-SQL. Разрешение SHOWPLAN не требуется. от: http://technet.microsoft.com/en-us/library/ms190287.aspx – Rob
Есть ли способ, которым я могу видеть все время, которое должна выполняться хранимой процедурой? Сейчас я вижу много отдельных измерений. – Rookian
@Rookian, я добавил код для ответа, чтобы помочь вам в этом. –
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]
Это дает время в наносекундах. Миллсекунды будут DATEDIFF (MS, @ StartTime, @ EndTime) – d512
еще лучше, это будет измерять среднее 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
Я изменил 'MICROSECOND' на' MILLISECOND' и очистил кеш каждый раз, когда я вставил следующие строки между 'begin' и' declare @ t0 ... ': ' КОНТРОЛЬНО-ПРОПУСКНОЙ ПУНКТ; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE; '. Работает как очарование и именно то, что я искал. +1 –
Я использую yr snippet для оценки инкрементных настроек производительности в хранимой процедуре, очень гладкий! – JayJay
Спасибо вам обоим. Я занимаюсь sql в течение долгого времени, его причудливый язык. Но как только вы знаете, что такое перегибы и как их открутить в свою пользу, хорошо это помогает много XD – HumbleWebDev
Вы используете Sql Server Management Studio? Он обычно отображает время, прошедшее для каждого запроса, хотя и только со вторым разрешением. Также см. Этот связанный вопрос: http://stackoverflow.com/questions/8247587/sql-server-management-studio-how-to-get-execution-time-down-to-milliseconds – mellamokb
@mellamokb: Я использую ssms. Второе разрешение слишком грубое. – TheMoot
@LittleBobbyTables: Я бегу в ssms. как использовать остановку? – TheMoot