web-dev-qa-db-ja.com

t-sqlクエリの実行にかかる時間を測定する

SqlServer 2005を使用して2つのt-sqlクエリがあります。各クエリの実行にかかる時間を測定するにはどうすればよいですか?

ストップウォッチを使用してもカットされません。

135
TheMoot

イベント間の「経過時間」を測定する単純なアプローチの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プロファイラーを使用して、クエリの経過時間を取得することもできます。

145
spencer7593

上記の答えよりも正確な測定が必要な場合:

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

結果はMessagesウィンドウに表示されます。

更新(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)
222
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]

このソリューションもご覧ください

12
atik sarker

さらに良いことに、これはクエリの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
6
HumbleWebDev

統計アイコンをクリックして表示し、クエリを実行してタイミングを取得し、クエリの効率を確認します

2
Ashish Patel