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

我有两个使用 SqlServer2005的 t-sql 查询。我怎样才能测量每一个运行所需的时间呢?

用我的秒表可不行。

261268 次浏览

度量事件之间“运行时间”的一种简单方法是只获取当前日期和时间。

在 SQLServerManagementStudio 中

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;

这只是一种方法,您还可以使用 SQLProfiler 获得查询的运行时间。

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

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)
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 次迭代的平均值。

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

单击 Statistics 图标以显示,然后运行查询以获得计时并了解查询的效率

另一种方法是使用名为 Client Statistics的 SQLServer 内置特性,该特性可通过 菜单 > 查询 > 包括客户端统计数据访问。

您可以在单独的查询窗口中运行每个查询,并比较 Client Statistics选项卡中 Messages选项卡旁边给出的结果。

例如,在下面的图像中,它显示了我的一个查询获得服务器响应的平均时间为39毫秒。

Result

您可以在 给你中读取获取执行时间的所有3种方法。 您甚至可能需要显示 Estimated Execution Plan CtrlL来进一步研究您的查询。

‘ Declaration@time1 as datetime = getdate ()

选择 * FROM [ dbo ] . [ Sheet1] 其中的名称如“% 1!% 2!”

Declaration@time2 as datetime = getdate () Select@time2 -@time1‘

这很管用,冠军