2012-03-13 58 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