【问题标题】:Calculate execution time of a SQL query?计算 SQL 查询的执行时间?
【发布时间】:2009-02-27 17:31:24
【问题描述】:

我在我的网站中提供搜索功能,当用户搜索记录时,我想显示查询所花费的时间以获得与谷歌相同的结果。当我们搜索任何内容时,谷歌会显示获得结果需要多长时间?

为此,我在我的 SP 中声明了一个 @start 变量,并在最后找到了不同之处,如下所示;

DECLARE @start_time DATETIME

SET @start_time = GETDATE()

-- my query
SELECT * FROM @search_temp_table

SELECT RTRIM(CAST(DATEDIFF(MS, @start_time, GETDATE()) AS CHAR(10))) AS 'TimeTaken'

有没有其他简单快捷的方法,或者单行查询,我们可以找出执行查询所花费的时间?

我使用的是 SQL Server 2005。

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    好吧,如果你真的想在你的数据库中这样做,MSDN 中给出了更准确的方法:

    SET STATISTICS TIME ON
    

    您也可以从您的应用程序中读取此信息。

    【讨论】:

    • 应用程序如何读取这些信息?微软的文章没有提及它。我给他们留下了反馈,询问我是否必须解析消息输出,或者是否有更结构化的方式来访问计时数据,特别是使用 .NET 框架类。
    • 好,但有点详细,它如何分解每个事件的时间,我只需要 2 点之间的总时间
    • @Triynko:时间可以在SqlConnection.InfoMessage-event 中阅读
    • 更多关于上述内容的信息可以在这里找到:sqlserver.info/management-studio/show-query-execution-time
    【解决方案2】:

    我发现这个更有用也更简单

    DECLARE @StartTime datetime,@EndTime datetime   
    SELECT @StartTime=GETDATE() 
    --Your Query to be run goes here--  
    SELECT @EndTime=GETDATE()   
    SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in milliseconds]   
    

    【讨论】:

    • 以毫秒为单位而不是微秒 DECLARE @StartTime datetime = GETDATE(),@EndTime datetime SET @EndTime=GETDATE() SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [持续时间以毫秒为单位]
    • 这不起作用,因为这些是运行时常量,并且在查询第一次运行时分配值,而不是在执行时分配值
    • @mark1234 我没听懂你说的。哪个不行?
    • 我已经尝试过很多次了,虽然开始和结束的时间可能不完全相同,但它们远不准确。例如,在最近的一个项目中,我的整个 SP(包括需要 6 分钟的索引重建)报告不到 1 分钟。我使用 datediff(millisecond, @Startdate, getdate()) 得到了更好的结果。我认为这是因为在执行期间到达该函数之前不会评估此函数。我没有确切的答案,但只是将 Getdate 分配给 Start 和 End 变量对我来说很遥远
    【解决方案3】:

    我们从应用程序代码中对此进行监控,仅包括建立/关闭连接和通过网络传输数据所需的时间。这很简单......

    Dim Duration 作为 TimeSpan
    将 StartTime 调暗为 DateTime = DateTime.Now
    
    '在这里调用数据库并执行你的SQL语句
    
    持续时间 = DateTime.Now.Subtract(StartTime)
    Console.WriteLine(String.Format("查询花费了 {0} 秒", Duration.TotalSeconds.ToString()))
    Console.ReadLine()

    【讨论】:

    • 最好使用System.Diagnostics.StopWatch
    • 我对您的回答投了反对票,因为它没有回答实际问题。很好,你已经用VB解决了,但考虑将faiz的答案标记为正确答案
    【解决方案4】:

    请使用

    -- turn on statistics IO for IO related 
    SET STATISTICS IO ON 
    GO
    

    用于时间计算

    SET STATISTICS TIME ON
    GO
    

    然后它将为每个查询给出结果。在查询输入窗口附近的消息窗口中。

    【讨论】:

      【解决方案5】:
      declare @sttime  datetime
      set @sttime=getdate()
      print @sttime
      Select * from ProductMaster   
      SELECT RTRIM(CAST(DATEDIFF(MS, @sttime, GETDATE()) AS CHAR(10))) AS 'TimeTaken'    
      

      【讨论】:

        【解决方案6】:

        为什么要用 SQL 来做呢?诚然,这确实显示了“真实”的查询时间,而不是查询时间+通过网络对数据进行洗牌的时间,但它会污染您的数据库代码。我怀疑您的用户是否会关心 - 事实上,他们可能宁愿包括网络时间,因为这都会影响他们查看页面所花费的时间。

        为什么不在您的 Web 应用程序代码中进行计时?除了其他任何事情之外,这意味着对于您想要执行任何计时但想要执行相同过程的情况,您不需要弄乱您不想要的东西'不需要。

        【讨论】:

        • 虽然连接+查询+网络传输的总时间很实用,但我更愿意排除网络传输时间,因为搜索引擎外部因素太多会影响它。我也喜欢让查询返回性能元数据的想法,这样应用程序就可以监控自己。这将允许应用程序在负载高时自动排除或替换查询,或者在产生总和的查询(例如,随着目标表大小的增长)开始定期超过某个阈值时警告开发人员。
        • 此外,当您添加增量功能时,查询的额外开销可能可以忽略不计,而查询时间本身可能不会。例如,我想通过一个新的 sum 查询向我的 Flash 客户端发送一个额外的整数,因此可以认为开销可以忽略不计(即 现有 数据流仅增加 4 或 5 个字节和数据库连接已为其他检索到的数据打开),而查询执行时间可能很长。
        【解决方案7】:

        你可以使用

        SET STATISTICS TIME { ON | OFF }
        

        显示解析、编译和执行每条语句所需的毫秒数

        当 SET STATISTICS TIME 为 ON 时,将显示语句的时间统计信息。关闭时,不显示时间统计

        USE AdventureWorks2012;  
        GO         
        SET STATISTICS TIME ON;  
        GO  
        SELECT ProductID, StartDate, EndDate, StandardCost   
        FROM Production.ProductCostHistory  
        WHERE StandardCost < 500.00;  
        GO  
        SET STATISTICS TIME OFF;  
        GO  
        

        【讨论】:

          【解决方案8】:

          试试这个

          DECLARE @StartTime DATETIME
          SET @StartTime = GETDATE()
          
            SET @EndTime = GETDATE()
            PRINT 'StartTime = ' + CONVERT(VARCHAR(30),@StartTime,121)
            PRINT '  EndTime = ' + CONVERT(VARCHAR(30),@EndTime,121)
            PRINT ' Duration = ' + CONVERT(VARCHAR(30),@EndTime -@starttime,114)
          

          如果还是不行,那就试试 SET STATISTICS TIME ON

          【讨论】:

            猜你喜欢
            • 2012-11-27
            • 2018-10-03
            • 1970-01-01
            • 1970-01-01
            • 2017-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多