为什么以下 SQL 服务器代码的执行时间不同?
Why the execution time is different for following SQL Server code?
注:忽略GO
......GO
里面的逻辑,只关注Line 1
和Line 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
结果不一样。
为什么会这样?
有很多原因,但最简单的一个是计算机是多任务处理的,即同时做很多事情。所以,这取决于它在做什么。
相信我,你不应该担心这种事情。它为什么如此重要?当您发现性能问题时,您必须担心执行时间的重要差异。担心这个是没有用的。
你得到不同的值,因为GETDATE()
returns 当前日期和时间,并且在第 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
可以让你得到执行计划,在其中你会看到对于每个语句,都有以下块:
对每个语句重复。 GETDATE()
是一个运行时常量,但是 可以 在同一条语句中计算多次,并且肯定会在多个语句中计算多次。
注:忽略GO
......GO
里面的逻辑,只关注Line 1
和Line 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
结果不一样。
为什么会这样?
有很多原因,但最简单的一个是计算机是多任务处理的,即同时做很多事情。所以,这取决于它在做什么。
相信我,你不应该担心这种事情。它为什么如此重要?当您发现性能问题时,您必须担心执行时间的重要差异。担心这个是没有用的。
你得到不同的值,因为GETDATE()
returns 当前日期和时间,并且在第 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
可以让你得到执行计划,在其中你会看到对于每个语句,都有以下块:
对每个语句重复。 GETDATE()
是一个运行时常量,但是 可以 在同一条语句中计算多次,并且肯定会在多个语句中计算多次。