Измерьте время, необходимое для выполнения запроса t-sql

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

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

Ответ 1

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

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

Ответ 2

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

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)

Ответ 4

еще лучше, это будет измерять среднее число 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

Ответ 5

Нажмите на иконку Статистика, чтобы отобразить, а затем выполнить запрос, чтобы узнать сроки и узнать, насколько эффективен ваш запрос.

Ответ 6

Другой способ - использовать встроенную функцию SQL Server с именем Include Client Statistics, которая доступна через Меню> Запрос> Включить статистику клиента.

Вы можете выполнить каждый запрос в отдельном окне запроса и сравнить результаты, которые приведены на вкладке Client Statistics рядом с вкладкой Message.

Например, на рисунке ниже показано, что среднее время, затраченное на получение ответа сервера на один из моих запросов, составляет 39 миллисекунд.

Result

Вы можете прочитать все 3 способа получения времени выполнения в здесь. Возможно, вам даже потребуется отобразить Estimated Execution Plan ctrl L для дальнейшего изучения вашего запроса.