У меня есть два запроса t-sql с использованием SqlServer 2005. Как я могу определить, сколько времени потребуется для каждого из них?
Использование моего секундомера не сокращает его.
У меня есть два запроса t-sql с использованием SqlServer 2005. Как я могу определить, сколько времени потребуется для каждого из них?
Использование моего секундомера не сокращает его.
Один упрощенный подход к измерению "прошедшего времени" между событиями - просто захватить текущую дату и время.
В 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.
Если вы хотите более точное измерение, чем ответ выше:
set statistics time on
-- Query 1 goes here
-- Query 2 goes here
set statistics time off
Результаты будут в окне "Сообщения".
Обновление (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)
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]
еще лучше, это будет измерять среднее число 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
Нажмите на иконку Статистика, чтобы отобразить, а затем выполнить запрос, чтобы узнать сроки и узнать, насколько эффективен ваш запрос.
Другой способ - использовать встроенную функцию SQL Server с именем Include Client Statistics
, которая доступна через Меню> Запрос> Включить статистику клиента.
Вы можете выполнить каждый запрос в отдельном окне запроса и сравнить результаты, которые приведены на вкладке Client Statistics
рядом с вкладкой Message
.
Например, на рисунке ниже показано, что среднее время, затраченное на получение ответа сервера на один из моих запросов, составляет 39 миллисекунд.
Вы можете прочитать все 3 способа получения времени выполнения в здесь.
Возможно, вам даже потребуется отобразить Estimated Execution Plan
ctrl L для дальнейшего изучения вашего запроса.