计算 SQL 查询的执行时间?

Posted

技术标签:

【中文标题】计算 SQL 查询的执行时间?【英文标题】:Calculate execution time of a SQL query? 【发布时间】: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。

【问题讨论】:

【参考方案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 我没听懂你说的。哪个不行? 看这里sqlblog.com/blogs/andrew_kelly/archive/2008/03/01/… 我已经尝试过很多次了,虽然开始和结束的时间可能不完全相同,但它们远不准确。例如,在最近的一个项目中,我的整个 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

【讨论】:

以上是关于计算 SQL 查询的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 Hibernate 在一个 Grails 请求中执行了多少 SQL 查询?

用于执行聚合和计算百分比的 SQL 查询

授予在静态数据库上执行 SQL 查询的权限

spark将列值作为sql查询执行

加快我的 SQL 查询速度?它给出了执行超时错误

Django:有没有办法从单元测试中计算 SQL 查询?