关于性能:测量执行t-sql查询所需的时间

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):

根据流行的请求,我编写了一个代码片段,您可以使用它来为整个存储过程运行计时,而不是为其组件计时。虽然这只返回上次运行所用的时间,但sys.dm_exec_procedure_stats返回的其他统计信息也可能有价值:

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


单击要显示的统计图标,然后运行查询以获取时间安排并了解查询的效率