Виміряйте час, необхідний для виконання запиту t-sql


156

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

Використання мого секундоміра не вирізає.


2
Чи використовуєте ви Sql Server Management Studio? Зазвичай він відображає час, що минув для кожного запиту, хоча і лише з другою роздільною здатністю. Також дивіться відповідне питання: stackoverflow.com/questions/8247587 / ...
mellamokb

Відповіді:


174

Один спрощений підхід до вимірювання "минулого часу" між подіями - це просто схопити поточну дату та час.

У студії управління SQL Server

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 про те, як це зробити, але не зміг знайти документа, який не потребував годин читання. Чи можете ви порекомендувати посилання "Профілер для манекенів"?
TheMoot

@TheMoot Я знаю, що я спізнююсь, але посилання MSDN ідеально підходять для ваших потреб "[Subject] for Dummies" :). Спробуйте поглянути на це, як: Використовуйте SQL Profiler
Джон Одом

Хтось ще мав проблеми з використанням цього в студії управління sql? Я додав його до набору з близько 15 запитів у збереженій процедурі для тестування, і це запускається занадто довго. Я скасував о 7 хвилині, і всі додані таймери були лише близько 2 хвилин. Тому я думаю, що існує певна проблема кеш-зворотного тексту, або, можливо, потрібно занадто багато часу, щоб обчислити всі датовані стільки.
MH

2
@Hanoncs: Існує невелика кількість часу, що використовується для оцінки GETDATE () та призначення результату змінній, і невелика кількість часу для оцінки DATEDIFF () та повернення результату. Спрощений підхід, який я запропонував, полягав у тому, щоб отримати грубі вимірювання для одиночних запитів. Я б не рекомендував використовувати цей підхід у тісному циклі у збереженій процедурі. Якби у мене була серія запитів у збереженій процедурі, я міг би використовувати цей підхід, щоб додати деякий вихід налагодження в деяких розумних точках, додавши стовпчик дискримінатора, щоб я міг знати, який рядок у процедурі видає результат.
spencer7593

1
Зазвичай я тримаюсь SET @t1 = GETDATE();у верхній частині запиту, а потім вставляю SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();в розумні точки запиту (редагуючи "ПРИМІТКА 1" відповідним чином). Розгляд селекторів як точок перерви, а не вимірювань, семантично ідентичний вашому підходу (хоча остаточний набір до @ t1 є помилковим, і це передбачає, що всі запити повинні бути виміряні). Це суто розумова / типізаційна оптимізація (одна паста на точку перерви, а не дві пасти на запит).
Брайан

251

Якщо ви хочете більш точного вимірювання, ніж відповідь вище:

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)=@ProcName AND
      (OBJECT_SCHEMA_NAME(object_id,database_id)=@SchemaName OR @SchemaName IS NULL) AND
      (DB_NAME(database_id)=@DbName OR @DbName IS NULL)

2
Лише зауважте, що ця функція недоступна, якщо ваш доступ до бази даних є лише для читання. To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. від: technet.microsoft.com/en-us/library/ms190287.aspx
Роб

5
Чи існує спосіб, коли я бачу весь час, що потрібно виконати збереженій процедурі? Зараз я бачу багато одиничних вимірювань.
Rookian

2
@Rookian, я додав код у відповідь, щоб допомогти вам у цьому.
Майкл Голдштейн


11

Інший спосіб - використання вбудованої функції SQL Server, названої Client Statisticsякої доступний через Меню> Запит> Включити статистику клієнта .

Ви можете запустити кожен запит у окремому вікні запиту та порівняти результати, які наведено у Client Statisticsвкладці біля Messagesвкладки.

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

Результат

Всі три способи отримання часу виконання ви можете прочитати тут . Можливо, вам навіть знадобиться відобразитись Estimated Execution Plan ctrlLдля подальшого вивчення вашого запиту.


7

ще краще, це вимірює середню кількість 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

4
Я змінив MICROSECONDдо MILLISECONDі очистити кеш кожен раз я вставлений наступні рядки між beginі declare @t0 ...: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;. Працює як шарм і саме те, що я шукав. +1
Daniel Z.

1
Я використовую фрагмент yr, щоб оцінити поступові зміни продуктивності до збереженої процедури, дуже гладкий!
JayJay

Дякую обом. Я вже давно займаюся sql, його вигадливою мовою. Але як тільки ви дізнаєтеся, що таке перекрути, і як їх
закрутити

3

Клацніть на піктограмі "Статистика", щоб відобразити, а потім запустіть запит, щоб отримати терміни та знати, наскільки ефективний ваш запит

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.