web-dev-qa-db-ja.com

SQL Server:NEWID()は常に一意のIDを提供しますか?

NEWID()関数は、以前と同じIDを私に決して与えませんか? NEWID()を選択し、「例」として「1」を返すとします。再び '1'を返すことはありませんか?不可能ですか?

18
user2254739

NEWID()NEWSEQUENTIALID() の両方が、タイプ uniqueidentifier のグローバルに一意な値を与えます。

NEWID()はランダムなアクティビティを伴うため、次の値は予測不能であり、実行が遅くなります。

NEWSEQUENTIALID()はランダムなアクティビティを伴わないため、 次の生成値を予測できます (簡単ではありません!)NEWID()よりも高速に実行されます。

したがって、(セキュリティ上の理由で)次の値が予測されることを心配していない場合は、NEWSEQUENTIALID()を使用できます。予測可能性を心配している場合、またはパフォーマンスのわずかなペナルティを気にしない場合は、NEWID()を使用できます。

ただし、厳密な意味では、異なるマシンによって生成されたGUIDが同じ値を持っている可能性は、ごくわずかです。実際には、不可能と見なされています。

さらに情報が必要な場合は、これをお読みください: GUIDを生成するための方法は、GUIDが本当に一意ですか?

NEWID()は、 RFC 4122 に準拠しています。もう1つの関数は、値を生成するためにMicrosoftのアルゴリズムを使用します。

19
JotaBe

同じマシンでNEWID()を実行している場合、現在のタイムスタンプが計算に組み込まれるため、戻り値は常に一意になります。

ただし、別のマシン/システムでは、技術的に同じIDを取得できますそれはIS不可能。

関連する

7
LCIII

同じ質問があったので、同じミリ秒であっても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を定義できます。

3