NEWID()
関数は、以前と同じIDを私に決して与えませんか? NEWID()
を選択し、「例」として「1」を返すとします。再び '1'を返すことはありませんか?不可能ですか?
NEWID()
と NEWSEQUENTIALID()
の両方が、タイプ uniqueidentifier
のグローバルに一意な値を与えます。
NEWID()
はランダムなアクティビティを伴うため、次の値は予測不能であり、実行が遅くなります。
NEWSEQUENTIALID()
はランダムなアクティビティを伴わないため、 次の生成値を予測できます (簡単ではありません!)NEWID()
よりも高速に実行されます。
したがって、(セキュリティ上の理由で)次の値が予測されることを心配していない場合は、NEWSEQUENTIALID()
を使用できます。予測可能性を心配している場合、またはパフォーマンスのわずかなペナルティを気にしない場合は、NEWID()
を使用できます。
ただし、厳密な意味では、異なるマシンによって生成されたGUIDが同じ値を持っている可能性は、ごくわずかです。実際には、不可能と見なされています。
さらに情報が必要な場合は、これをお読みください: GUIDを生成するための方法は、GUIDが本当に一意ですか?
注NEWID()
は、 RFC 4122 に準拠しています。もう1つの関数は、値を生成するためにMicrosoftのアルゴリズムを使用します。
同じマシンでNEWID()
を実行している場合、現在のタイムスタンプが計算に組み込まれるため、戻り値は常に一意になります。
ただし、別のマシン/システムでは、技術的に同じIDを取得できますそれはIS不可能。
関連する
同じ質問があったので、同じミリ秒であってもIDが繰り返されないことがわかるように、この簡単なクエリを実行してnewid()がどれほど一意であるかを確認しました。
DECLARE @TRIES BIGINT, @ID UNIQUEIDENTIFIER, @REPEATED_ID UNIQUEIDENTIFIER
SET @TRIES = 1
SET @REPEATED_ID=NEWID()
WHILE @TRIES <= 1000
BEGIN
SET @ID=NEWID()
IF @REPEATED_ID=@ID
PRINT 'SAME -> ID '+CONVERT(NVARCHAR(MAX),@TRIES)+': '+ CONVERT(CHAR(36),@ID)
ELSE
PRINT 'DISTINCT -> ID '+CONVERT(NVARCHAR(MAX),@TRIES)+': '+ CONVERT(CHAR(36),@ID) + ' AT ' + CONVERT(VARCHAR,CAST(GETDATE() AS DATETIME2(3))
)
SET @TRIES += 1
SET @REPEATED_ID=@ID
END
必要に応じて@TRIESを定義できます。