计算 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 查询的执行时间?的主要内容,如果未能解决你的问题,请参考以下文章