有什么理由我应该每次都停止使用 SYSDATETIME() 而不是 GETDATE() ?
他们不是都问 cpu 现在是什么时间,还是 sysdatetime 需要更多指令来计算分数?Getdate 是否可以四舍五入?sysdatetime 可以更快,因为它不能进行舍入吗?
如果我不存储纳秒,我显然不会使用 sysdatetime,但我问的是存储大小以外的成本。(我正在开发的当前应用程序每秒运行 sysdatetime() 至少 280 次)
有什么理由我应该每次都停止使用 SYSDATETIME() 而不是 GETDATE() ?
他们不是都问 cpu 现在是什么时间,还是 sysdatetime 需要更多指令来计算分数?Getdate 是否可以四舍五入?sysdatetime 可以更快,因为它不能进行舍入吗?
如果我不存储纳秒,我显然不会使用 sysdatetime,但我问的是存储大小以外的成本。(我正在开发的当前应用程序每秒运行 sysdatetime() 至少 280 次)
SELECT SYSDATETIME();
GO
DECLARE @d DATETIME2(7) = SYSDATETIME();
GO 10000
SELECT SYSDATETIME();
GO
DECLARE @d DATETIME = SYSDATETIME();
GO 10000
SELECT SYSDATETIME();
GO
DECLARE @d DATETIME2(7) = GETDATE();
GO 10000
SELECT SYSDATETIME();
GO
DECLARE @d DATETIME = GETDATE();
GO 10000
SELECT SYSDATETIME();
结果:
所以这似乎无关紧要。重要的是您将其分配给哪种类型的变量,即使这样也不是很多。10000/0.1 秒意味着增量非常非常小,不足以担心。在这种情况下,我宁愿保持一致。
在一些设计极差的测试中,在我的机器上看起来SYSDATETIME()
可能更快:
select sysdatetime()
go
declare @Dt datetime
select @dt = sysdatetime()
select @dt = DATEADD(day,1,@dt)
go 15000
select sysdatetime()
go
declare @Dt datetime
select @dt = GETDATE()
select @dt = DATEADD(day,1,@dt)
go 15000
select sysdatetime()
go
在我的机器上,这往往会在前两个结果集之间产生约 1 秒的差距,在第二和第三个结果集之间产生约 2 秒的差距。颠倒两个测试的顺序可以颠倒差距。