2016-02-21 45 views
1

我使用以下方法來粗略估量經過的時間來執行通過SSMS(SQL Server Management Studio中)的存儲過程:爲什麼DATEDIFF在第一次執行後將結果加倍?

USE [MyDB] 
GO 

DECLARE @t1 DATETIME; 
DECLARE @t2 DATETIME; 
SET @t1 = GETDATE(); 

DECLARE @TTIdsList dbo.TTIdsList_ident 
INSERT INTO @TTIdsList(Id) 
VALUES (7890137988314100) 
DECLARE @return_value int 
EXEC @return_value = [mySCH].[DataLoadByList] 
     @CaseIds = @TTIdsList 
SELECT 'Return Value' = @return_value 

SET @t2 = GETDATE(); 
SELECT DATEDIFF(microsecond,@t1,@t2) AS elapsed_us; 
GO 

它工作得很好,但它返回的第一個執行一個不同的結果(3000微秒) 。在所有後續執行中,它返回雙精度:6000微秒。

我錯過了這些變量初始化的方式嗎?如果是這樣,我錯過了什麼?

+1

它可能是編譯時間爲你使用存儲過程。爲了測試這個建議,在'EXEC ...'和'SET @ t2'之前將'SET @ t1'移到右邊,看看會發生什麼。 –

+0

@ZoharPeled我完全按照你所說的做了,並且我仍然得到相同的結果:第一次運行3000微秒,第二次,第三次,第四次以及隨後的任何運行都是6000微秒。順便說一句,每次我重命名'elapsed_us',它會回到3000微秒(我認爲這是正確的值)。奇怪的。 – datps

+0

所以這是存儲過程的編譯時間。驗證您是否可以在存儲過程中添加「RECOMPILE」提示。如果我是正確的,你會發現時間在3000微秒內穩定。 –

回答

2

TSQL datetime沒有微秒分辨率。分辨率是1/300秒,並且四捨五入到小數點後三位。

這意味着如果實際使用時間在1/300秒和2/300秒之間,有時會達到3毫秒,有時會有6毫秒的差異。

要獲得實際值,您需要具有您所尋求的分辨率的時間測量。嘗試使用數據類型datetime2和功能SYSUTCDATETIME(),這實際上確實有足夠的精度來回答您的問題。

+0

哇。有用。謝謝。 – datps

相關問題