5

GETDATE() の代わりに SYSDATETIME() を毎回使用するのをやめるべき理由はありますか?

どちらも CPU に現在時刻を尋ねていませんか、それとも分数を計算するために sysdatetime にさらに命令が必要ですか? Getdate はそれを丸めますか? 丸めが機能していないため、sysdatetime を高速化できますか?

ナノ秒を保存していない場合は明らかにsysdatetimeを使用しませんが、ストレージサイズ以外のコストについて質問しています。(私が開発している現在のアプリは、sysdatetime() を少なくとも 1 秒間に 280 回実行します)

4

2 に答える 2

19
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();

結果:

  • SYSDATETIME を DATETIME2(7) に割り当てる: 3.4 秒
  • SYSDATETIME を DATETIME に割り当てる: 3.3 秒
  • GETDATE を DATETIME2(7) に割り当てる: 3.4 秒
  • GETDATE を DATETIME に割り当てる: 3.3 秒

したがって、それは問題ではないようです。重要なのは、それを割り当てる変数のタイプであり、それでさえそれほど重要ではありません。10000/0.1 秒は、デルタが非常に小さく、心配するほどではないことを意味します。この場合、私はむしろ一貫したいと思います。

于 2013-02-13T15:17:38.223 に答える
6

非常に設計が不十分ないくつかのテストでは、私のマシンではより高速である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

私のマシンでは、これにより、最初の 2 つの結果セットの間に ~1 秒、2 番目と 3 番目の間に ~2 秒のギャップが生じる傾向があります。2 つのテストの順序を逆にすると、ギャップが逆になります。

于 2013-02-13T15:14:59.117 に答える