2012-03-13 57 views
4

我有一个脚本需要执行并需要执行持续时间,我该如何计算它?获取在SQl Server 2008 R2中执行脚本的持续时间

我想用这样的方式:

DECLARE @startTime DATETIME 
SET @startTime = GETDATE(); 

--Script 


DECLARE @endTime DATETIME 
SET @endTime = GETDATE(); 

PRINT 'Transfer Duration:'; 
GO 
PRINT CONVERT(varchar,@[email protected],14); 
GO 

但因为我用GO(我有),所以有错误,那么,什么是您的建议来计算和执行脚本的打印时间(以Go)?

回答

4

使用表格来存储开始和结束时间,并且还会输入您的进程ID。然后使用DATEDIFF()计算经过的时间。

CREATE TABLE Profiling(
      spid   smallint  NOT NULL, 
      StartTime  DATETIME2  NOT NULL, 
      EndTime   DATETIME2 
    ) 

    INSERT INTO Profiling(spid, StartTime) 
    SELECT @@SPID, CURRENT_TIMESTAMP 
    GO 

    -- your queries come here 
    -- ..... 

    UPDATE Profiling 
    SET EndTime = CURRENT_TIMESTAMP 
    WHERE spid = @@SPID 
    GO 

    SELECT DATEDIFF(MS, startTime, EndTime) as MilliSeconds 
    FROM Profiling 
    WHERE spid = @@SPID 

不时截断表格,以避免spid的冲突。

+0

语法无效。您的临时变量在您写入'go'时立即死亡 – 2012-03-13 11:36:41

+0

“语法无效”?你在RDBMS上做了什么?它在SQL Server 2005上完美工作。“你的临时变量”?在上面的代码中根本没有使用单个(临时)变量! @@ SPID是Tranact-SQL函数中的一个构建,而不是一个变量。请停止拖动。 – Wim 2012-03-13 12:06:15

+0

我appologize,我测试了类似的失败,你的脚本工作正常 – 2012-03-13 13:29:38

4

看看SET STATISTICS TIME声明。

+0

谢谢你的回答,但是'STATISTIC Time'计算任何一批命令被'GO'分开的时间,实际上用这种方式我的脚本执行时间加倍了,而且我只需要一个持续时间脚本。 – Saeid 2012-03-13 10:54:28

0
Go 
DECLARE @startTime DATETIME 
SET @startTime = GETDATE(); 

-- your sql statement 

DECLARE @endTime DATETIME 
SET @endTime = GETDATE(); 

PRINT 'Transfer Duration:'; 

PRINT cast((@[email protected]) AS TIME); 
Go 

或更准确,你可以使用SET STATISTICS TIME这显示解析,编译和执行各语句所需的毫秒数。

+0

因为DATETIME只有3.33ms的准确性,所以这不会真的是非常准确和非常有用的,我认为..... SQL Server 2008将具有'DATETIME2',准确度为100ns - *可能*更有用(PS:我没有downvote - 只是想指出你推荐的解决方案的缺点) – 2012-03-13 10:38:46

+0

@marc_s谢谢你指出了这一点。 – 2012-03-13 10:50:32

+0

@Viswanathan Iyer谢谢你的回答,但是在主要问题中,我强调我必须使用'GO'命令, – Saeid 2012-03-13 10:57:25