为什么后续SQL Server代码的执行时间不同?

时间:2015-03-02 08:53:51

标签: sql sql-server-2008 function time execution

注意:忽略GO ........... GO内的逻辑,只关注Line 1Line N

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结果不一样。 为什么会这样?

2 个答案:

答案 0 :(得分:0)

有很多原因,最简单的原因是计算机是多任务的,即同时做很多事情。所以,这取决于它正在做什么。

相信我,你不应该担心这种事情。它为什么如此重要?当您发现性能问题时,您必须担心执行时间的重要差异。担心这一点毫无用处。

答案 1 :(得分: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()是一个运行时常量,但可以在同一个语句中多次评估,并且对于多个语句肯定会被多次评估。