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

问题描述 投票:0回答:8

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

使用我的秒表并不能解决问题。

performance sql-server-2005
8个回答
302
投票

如果您想要比上述答案更准确的测量:

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)

224
投票

测量事件之间“经过的时间”的一种简单方法是获取当前日期和时间。

在 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 Profiler 获取查询的运行时间。


34
投票

另一种方法是使用名为

Client Statistics
的 SQL Server 内置功能,可通过 菜单 > 查询 > 包括客户端统计信息访问该功能。

您可以在单独的查询窗口中运行每个查询,并比较

Client Statistics
选项卡旁边的
Messages
选项卡中给出的结果。

例如下图所示,我的一个查询得到服务器回复的平均时间是 39 毫秒。

您可以在这里阅读获取执行时间的所有 3 种方法。 您甚至可能需要显示

Estimated Execution Plan
ctrlL 以便进一步调查您的查询。


28
投票
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]

您也可以查看此解决方案


10
投票

更好的是,这将测量查询的 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

4
投票

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


1
投票

`声明 @time1 为 datetime =getdate()

选择* 来自 [dbo].[表 1] 其中名称如“%d%”

将 @time2 声明为 datetime =getdate() 选择@time2-@time1`

这简直就是冠军


0
投票

稍微改变@spencer7593的答案

SET @tStart = GETDATE();
-- hard query
SET @tEnd = GETDATE();
PRINT ('Elapsed:' + CAST(  DATEDIFF(millisecond,@tStart,@tEnd) AS varchar) + ' ms');

结果:

已用时间:250 毫秒

© www.soinside.com 2019 - 2024. All rights reserved.