Measure the time it takes to execute a t-sql query
我有两个使用SQLServer2005的T-SQL查询。我该如何衡量每个人跑多长时间?
用我的秒表是不行的。
如果您想要比上述答案更精确的测量:
1 2 3 4 5 6 7 | set statistics time on -- Query 1 goes here -- Query 2 goes here set statistics time off |
结果将显示在消息窗口中。
更新(2015-07-29):
根据流行的请求,我编写了一个代码片段,您可以使用它来为整个存储过程运行计时,而不是为其组件计时。虽然这只返回上次运行所用的时间,但
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- 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) |
测量事件之间的"经过时间"的一种简单方法是只获取当前日期和时间。
在SQL Server Management Studio中
1 2 3 4 5 | SELECT GETDATE(); SELECT /* query one */ 1 ; SELECT GETDATE(); SELECT /* query two */ 2 ; SELECT GETDATE(); |
要计算经过的时间,可以将这些日期值抓取到变量中,并使用datediff函数:
1 2 3 4 5 6 7 8 9 10 11 12 | 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事件探查器获取查询的运行时间。
1 2 3 4 5 6 7 8 9 10 11 | 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] |
您也可以看到这个解决方案
更好的是,这将测量您的查询的n次迭代的平均值!非常适合更精确的读数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 |
单击要显示的统计图标,然后运行查询以获取时间安排并了解查询的效率