测量执行t-sql查询所花费的时间

我有两个使用SqlServer 2005的t-sql查询。我怎样测量每个运行需要多长时间?

使用我的秒表不会削减它。

测量事件之间“stream逝的时间”的一种简单的方法是只抓取当前的date和时间。

在SQL Server Management Studio中

SELECT GETDATE(); SELECT /* query one */ 1 ; SELECT GETDATE(); SELECT /* query two */ 2 ; SELECT GETDATE(); 

要计算已用时间,可以将这些date值转换为variables,并使用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事件探查器查询经过的时间。

如果你想要比上面的答案更精确的测量:

 set statistics time on -- Query 1 goes here -- Query 2 goes here set statistics time off 

结果将在“ 消息”窗口中显示。

更新(2015-07-29):

通过stream行的请求,我写了一个代码片段,您可以使用它来计时整个存储过程运行,而不是其组件。 虽然这只返回最后一次运行所花费的时间,但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) 
 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(NS,@StartTime,@EndTime) AS [Duration in millisecs] 

你也可以看到这个解决scheme

甚至更好,这将衡量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