У мене є два запити t-sql за допомогою SqlServer 2005. Як я можу виміряти, скільки часу потрібно для кожного з них?
Використання мого секундоміра не вирізає.
У мене є два запити t-sql за допомогою SqlServer 2005. Як я можу виміряти, скільки часу потрібно для кожного з них?
Використання мого секундоміра не вирізає.
Відповіді:
Один спрощений підхід до вимірювання "минулого часу" між подіями - це просто схопити поточну дату та час.
У студії управління 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.
SET @t1 = GETDATE();
у верхній частині запиту, а потім вставляю SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE();
в розумні точки запиту (редагуючи "ПРИМІТКА 1" відповідним чином). Розгляд селекторів як точок перерви, а не вимірювань, семантично ідентичний вашому підходу (хоча остаточний набір до @ t1 є помилковим, і це передбачає, що всі запити повинні бути виміряні). Це суто розумова / типізаційна оптимізація (одна паста на точку перерви, а не дві пасти на запит).
Якщо ви хочете більш точного вимірювання, ніж відповідь вище:
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)
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
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]
Інший спосіб - використання вбудованої функції SQL Server, названої Client Statistics
якої доступний через Меню> Запит> Включити статистику клієнта .
Ви можете запустити кожен запит у окремому вікні запиту та порівняти результати, які наведено у Client Statistics
вкладці біля Messages
вкладки.
Наприклад, на зображенні нижче видно, що середній час, який минув для отримання відповіді сервера на один із моїх запитів, становить 39 мілісекунд.
Всі три способи отримання часу виконання ви можете прочитати тут . Можливо, вам навіть знадобиться відобразитись Estimated Execution Plan
ctrlLдля подальшого вивчення вашого запиту.
ще краще, це вимірює середню кількість 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 ...
: CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;
. Працює як шарм і саме те, що я шукав. +1
Клацніть на піктограмі "Статистика", щоб відобразити, а потім запустіть запит, щоб отримати терміни та знати, наскільки ефективний ваш запит