【问题标题】:Measure the time it takes to execute a t-sql query测量执行 t-sql 查询所需的时间
【发布时间】:2019-11-28 12:48:58
【问题描述】:

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

使用我的秒表并没有减少它。

【问题讨论】:

  • 您在使用 Sql Server Management Studio 吗?它通常显示每个查询经过的时间,尽管只有第二个分辨率。另请参阅此相关问题:stackoverflow.com/questions/8247587/…

标签: performance sql-server-2005


【解决方案1】:

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

set statistics time on 

-- Query 1 goes here

-- Query 2 goes here

set statistics time off

结果将显示在消息窗口中。

更新(2015-07-29):

应大家的要求,我编写了一个代码 sn-p,您可以使用它来计时整个存储过程的运行时间,而不是它的组件。虽然这仅返回上次运行所用的时间,但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)

【讨论】:

  • 请注意,如果您对数据库的访问是只读的,则此功能不可用。 To use SET STATISTICS TIME, users must have the appropriate permissions to execute the Transact-SQL statement. The SHOWPLAN permission is not required. 来自:technet.microsoft.com/en-us/library/ms190287.aspx
  • 有没有办法可以查看存储过程需要执行的全部时间?现在我看到很多单一的测量值。
  • @Rookian,我在答案中添加了一些代码来帮助您。
  • 什么消息窗口?
【解决方案2】:

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

在 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 获取查询的经过时间。

【讨论】:

  • 我查找了有关如何执行此操作的 Sql Profiler 文档,但找不到不需要数小时阅读的文档。你能推荐一个“Profiler for Dummies”链接吗?
  • @TheMoot 我知道我迟到了,但 MSDN 链接非常适合您的“[Subject] for Dummies”需求 :)。试试看这个How To: Use SQL Profiler
  • 还有其他人在 sql management studio 中使用这个有问题吗?我将它添加到存储过程中的一组大约 15 个查询中进行测试,运行时间太长。我在 7 分钟取消,所有计时器加起来只有 2 分钟左右。所以我认为有一些返回文本缓存问题,或者计算这么多的所有日期差异可能需要太长时间。
  • @Hanoncs:有一小段时间用于评估 GETDATE() 并将结果分配给一个变量,并且有一小段时间用于评估 DATEDIFF() 并返回结果。我提出的简单方法是对单例查询进行粗略测量。我不建议在存储过程的紧密循环中使用这种方法。如果我在存储过程中有一系列查询,我可能会使用这种方法在一些明智的点添加一些调试输出,添加一个鉴别器列,以便我可以知道过程中的哪一行发出了哪个结果。
  • 我通常将SET @t1 = GETDATE(); 粘贴在查询的顶部,然后将SET @t2 = GETDATE();SELECT 'NOTE 1',DATEDIFF(millisecond,@t1,@t2) AS elapsed_ms;SET @t1 = GETDATE(); 粘贴到查询中的适当位置(适当地编辑“NOTE 1”)。将选择视为断点而不是测量在语义上与您的方法相同(尽管@t1 的最终设置是虚假的,并且假设所有查询都应该被测量)。这纯粹是一种心理/打字优化(每个断点粘贴一次,而不是每个查询粘贴两次)。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:
    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]
    

    You can also See this solution

    【讨论】:

    • 以纳秒为单位给出时间。毫秒将是 DATEDIFF(MS,@StartTime,@EndTime)
    【解决方案5】:

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

    【讨论】:

    • 我将MICROSECOND 更改为MILLISECOND 并在每次插入begindeclare @t0 ... 之间的以下行时清除缓存:CHECKPOINT; DBCC DROPCLEANBUFFERS; DBCC FREEPROCCACHE;。像魅力一样工作,正是我想要的。 +1
    • 我一直在使用 yr sn-p 来衡量存储过程的增量性能调整,非常巧妙!
    • 谢谢你们。我一直在做 sql 很长时间了,它是一种古怪的语言。但是,一旦您知道这些问题是什么以及如何利用它们来发挥自己的优势,那么它会很有帮助 XD
    • 这很好用。但是,如果结果集很大,有一种方法可以禁止 SSMS 在运行整个查询的同时显示结果集....另请参阅我自己回答的问题:dba.stackexchange.com/questions/307922/…
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2018-08-21
      • 1970-01-01
      相关资源
      最近更新 更多