2015-03-02 88 views
0

注:忽視的邏輯內部GO ........... GO,只關注Line 1Line N爲什麼執行時間與以下SQL Server代碼不同?

SELECT DATENAME(NANOSECOND, GETDATE()) --Line 1 

GO 
BEGIN 
    DECLARE @t1 NVARCHAR(100) 
    DECLARE @datetime1 DATETIME = '12-23-35'; 
    DECLARE @time1 TIME(4) = '11:10:05.1234'; 
    DECLARE @time2 TIME(5) = '11:10:05.12345'; 
    DECLARE @datetime2 DATETIME; 

    SET @datetime2 = @datetime1 
    SET @datetime2 = @time1 

    DECLARE @datetime3 DATETIME = @time2 
    DECLARE @datetime4 SMALLDATETIME = @time1 

    IF @datetime1 = @datetime2 
     PRINT 'True' 
    ELSE 
     PRINT 'False' 

    IF @datetime2 = @datetime3 
     PRINT 'True' 
    ELSE 
     PRINT 'False' 

    IF @datetime3 = @datetime4 
     PRINT 'True' 
    ELSE 
     PRINT 'False' 

    SELECT @datetime1 AS 'datetime1' 
     ,@datetime2 AS 'datetimevar2' 
     ,@datetime3 AS 'datetimevar3' 
     ,@datetime4 AS 'datetimevar4' 
END 
GO 

SELECT DATENAME(NANOSECOND, GETDATE()) --Line N 

問題: 對於上面的代碼中,在每一個新的執行 Line N結果 - Line1結果不一樣。 這是爲什麼呢?

+0

您希望每次執行相同的代碼時都需要完全相同的時間嗎? – Rubik 2015-03-02 08:59:30

回答

0

有很多原因,最簡單的原因是計算機是多任務處理,即在同一時間做很多事情。所以,這取決於它在做什麼。

相信我,你不應該擔心這種事情。它爲什麼如此重要?當您發現性能問題時,您不得不擔心執行時間的重要差異。擔心這是沒用的。

0

你得到不同的值,因爲GETDATE()返回當前的日期和時間,時間線1和第n行的執行之間的流逝,你可以大量簡化您的查詢,並得到同樣的結果:

SELECT TOP 1 DATENAME(NANOSECOND, GETDATE()) --Line 1 
WAITFOR DELAY '00:00:00.01'; 
SELECT TOP 1 DATENAME(NANOSECOND, GETDATE()) --Line N 

有在那裏TOP 1可以讓你得到執行計劃時,您將在其中看到每次發言,有下列塊:

enter image description here

是爲每個陳述重複。 GETDATE()是一個運行時常量,但可以不止一次在同一語句中進行評估,並且對於多個語句肯定會評估多次。

相關問題