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

The*_*oot 145 performance sql-server-2005

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

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

Mic*_*eyn 235

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

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off
Run Code Online (Sandbox Code Playgroud)

结果将显示在" 消息"窗口中.

更新(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)
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法可以看到存储过程需要执行的整个时间?现在我看到很多单一测量. (4认同)
  • 请注意,如果您对数据库的访问权限是只读的,则此功能不可用.`要使用SET STATISTICS TIME,用户必须具有执行Transact-SQL语句的相应权限.SHOWPLAN权限不是必需的.来自:http://technet.microsoft.com/en-us/library/ms190287.aspx (2认同)
  • @Rookian,我在答案中添加了一些代码来帮助您。 (2认同)

spe*_*593 161

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

在SQL Server Management Studio中

SELECT GETDATE();
SELECT /* query one */ 1 ;
SELECT GETDATE();
SELECT /* query two */ 2 ; 
SELECT GETDATE(); 
Run Code Online (Sandbox Code Playgroud)

要计算经过的时间,您可以将这些日期值捕获到变量中,并使用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;
Run Code Online (Sandbox Code Playgroud)

这只是一种方法.您还可以使用SQL事件探查器获取查询的已用时间.

  • 我通常将 `SET @t1 = GETDATE();` 粘贴在查询顶部,然后粘贴 `SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms; SET @t1 = GETDATE();` 在查询中的明智点处(适当编辑“NOTE 1”)。将选择视为断点而不是测量在语义上与您的方法相同(尽管最终设置为 @t1 是虚假的,并且这假设应测量所有查询)。这纯粹是一种心理/打字优化(每个断点一次粘贴,而不是每个查询两次粘贴)。 (4认同)
  • @Hanoncs:有一小部分时间用于评估GETDATE()并将结果分配给变量,并花费少量时间来评估DATEDIFF(),并返回结果.我提出的简单方法是对单例查询进行粗略测量.我不建议在存储过程的紧密循环中使用此方法.如果我在存储过程中有一系列查询,我可能会使用这种方法在一些明智的点添加一些调试输出,添加一个鉴别器列,这样我就可以知道过程中哪一行发出了哪个结果. (2认同)

Moh*_*avi 26

另一种方法是使用名为的 SQL Server 内置功能Client Statistics,该功能可通过Menu > Query > Include Client Statistics 访问

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

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

结果

您可以在此处阅读获取执行时间的所有 3 种方法。您甚至可能需要显示Estimated Execution Plan ctrlL以进一步调查您的查询。


ati*_*ker 15

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]
Run Code Online (Sandbox Code Playgroud)

您也可以看到此解决方案

  • 这给出了以纳秒为单位的时间.Milleseconds将是DATEDIFF(MS,@ StartTime,@ EndTime) (9认同)

Hum*_*Dev 6

更好的是,这将测量查询的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
Run Code Online (Sandbox Code Playgroud)

  • 每次我在`begin`和`declare @ t0 ...```CHECKPOINT之间插入以下行时,我将`MICROSECOND`改为`MILLISECOND`并清除缓存.DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;`.像魅力和我正在寻找的工作.+1 (3认同)
  • 我一直在使用 yr 片段来衡量对存储过程的增量性能调整,非常灵活! (2认同)