sql >> データベース >  >> RDS >> Sqlserver

SQL ServerのNEWID()とNEWSEQUENTIALID():違いは何ですか?

    SQL Serverでは、両方のNEWSEQUENTIALID() 関数とNEWID() 関数は、GUID(グローバル一意識別子)を作成します。これは、UUID(ユニバーサル一意識別子)とも呼ばれます。

    GUIDは、タイプ uniqueidentifierの列で一意の識別子として使用できます。 、したがって、両方の機能をその目的に使用できます。

    ただし、これら2つの機能には違いがあり、どちらを使用するかの決定に影響を与える可能性があります。

    違い

    これら2つの機能の主な違いは次のとおりです。

    NEWID() NEWSEQUENTIALID()
    GUID ランダムなGUIDを作成します。 シーケンシャルGUIDを作成します。
    アプローチ GUIDはRFC4122バージョン4に準拠しており、GUIDがランダムまたは疑似ランダムに生成されることを指定しています。 Windowsの起動以降、指定されたコンピューターでこの関数によって以前に生成されたGUIDよりも大きいGUIDを作成します。 Windowsを再起動した後、GUIDはより低い範囲から再開できますが、それでもグローバルに一意です。
    リターンタイプ 一意の識別子 一意の識別子
    使用法 アドホッククエリ、テーブル、変数などで使用できます DEFAULTでのみ使用できます タイプuniqueidentifierのテーブル列に対する制約 。
    パフォーマンス NEWSEQUENTIALID()よりも遅くなる可能性があります 、NEWID() ランダムなアクティビティが発生し、キャッシュされたデータページの使用量が少なくなります。 NEWID()よりも高速である可能性があります 、NEWID ランダムなアクティビティが発生し、使用するキャッシュデータページが少なくなります。 NEWSEQUENTIALID()の使用 また、データとインデックスページを完全に埋めるのにも役立ちます。
    セキュリティ GUIDがランダムに生成され、推測が難しいため、より安全です。 安全性が低い。次に生成されたGUIDの値を推測できるため、そのGUIDに関連付けられたデータにアクセスできます。

    内部には他にもたくさんの違いがあると思いますが、これらがユーザーの観点からの主な違いです。

    例1-GUIDの比較

    これらの各関数が生成するGUIDの違いを示す簡単な例を次に示します。

    CREATE TABLE GUIDTest
    (
        NewIdCol uniqueidentifier NOT NULL DEFAULT NEWID(),
        NewSequentialIdCol uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(),
    );
    GO
    
    INSERT GUIDTest (NewIdCol, NewSequentialIdCol)
    VALUES (DEFAULT, DEFAULT);
    GO 20
    
    SELECT 
      NewIdCol AS [NEWID()],
      NewSequentialIdCol AS [NEWSEQUENTIALID()]
    FROM GUIDTest;
    GO
    

    結果:

    +--------------------------------------+--------------------------------------+
    | NEWID()                              | NEWSEQUENTIALID()                    |
    |--------------------------------------+--------------------------------------|
    | 965320de-8997-4e37-8fe9-a7daa52b04aa | 246f433e-f36b-1410-8a80-007d2b533547 |
    | 5c038bef-c2e1-4558-bd91-49b98fde5c71 | 266f433e-f36b-1410-8a80-007d2b533547 |
    | e7cfba90-78b6-4360-87a8-0b392fd227e5 | 286f433e-f36b-1410-8a80-007d2b533547 |
    | 9bf5b052-7023-4f52-939e-b5fb8f8ea27a | 2a6f433e-f36b-1410-8a80-007d2b533547 |
    | ccb38891-3689-42ed-91f2-79ddf0abeb2f | 2c6f433e-f36b-1410-8a80-007d2b533547 |
    | 8646ab08-6e4b-4cd6-9b25-ec0440c0f7f3 | 2e6f433e-f36b-1410-8a80-007d2b533547 |
    | f14e18a5-669a-4a2d-8793-42b705fc134f | 306f433e-f36b-1410-8a80-007d2b533547 |
    | 09ec2418-cfa0-4c8b-9b08-78e6f7946488 | 326f433e-f36b-1410-8a80-007d2b533547 |
    | 3ca2b71c-5f84-4db9-aa0f-fb9f215ceb09 | 346f433e-f36b-1410-8a80-007d2b533547 |
    | ccaed0a6-5851-472d-8b6a-db29581f2a43 | 366f433e-f36b-1410-8a80-007d2b533547 |
    | be6f9d97-7c86-4e43-9127-1aaa0c75d8b5 | 386f433e-f36b-1410-8a80-007d2b533547 |
    | b4c7b9e9-6f0c-44fc-904b-1aae2dfd20f9 | 3a6f433e-f36b-1410-8a80-007d2b533547 |
    | 378b2be8-b368-462f-ad30-896b67974b11 | 3c6f433e-f36b-1410-8a80-007d2b533547 |
    | 390c58ce-8d5c-454b-8c80-e0a690f113b9 | 3e6f433e-f36b-1410-8a80-007d2b533547 |
    | 4d2d9c64-bf04-44d2-bee3-4a2a33da05bd | 406f433e-f36b-1410-8a80-007d2b533547 |
    | 87e73722-bc1c-43f1-b94d-c89053bdc408 | 426f433e-f36b-1410-8a80-007d2b533547 |
    | 2caf72a0-4a19-4743-b299-99610d44aab2 | 446f433e-f36b-1410-8a80-007d2b533547 |
    | 3ed0dd28-19d5-44f5-90dc-6ded08269b37 | 466f433e-f36b-1410-8a80-007d2b533547 |
    | ce768fd8-df02-4d8f-afd4-a62d04571713 | 486f433e-f36b-1410-8a80-007d2b533547 |
    | 6ca41865-bbee-418a-aa6d-582a4541119d | 4a6f433e-f36b-1410-8a80-007d2b533547 |
    +--------------------------------------+--------------------------------------+
    

    NEWSEQUENTIALID() NEWID()に対して、列は順番に増加しています。 列はランダムに見えます。

    両方の列にGUIDが含まれており、有効な一意の識別子 タイプ。

    NEWID()について 列を見ると、すべての値がRFC 4122バージョン/(サブタイプ)4であることがわかります。これは、GUIDがランダムまたは疑似ランダムに生成されることを指定します。 4は関連する場所にあるため、バージョン4であることがわかります(すべての行の形式は xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx です。 )。

    例2–クエリでの使用

    前述のように、NEWID()のみ クエリで使用できます。

    たとえば、次のように実行できます。

    SELECT NEWID() AS [NEWID()];
    

    結果:

    +--------------------------------------+
    | NEWID()                              |
    |--------------------------------------|
    | ba07340c-6308-44d0-8c4b-52ed5e4a1601 |
    +--------------------------------------+
    

    ただし、これを行うことはできません:

    SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];
    

    結果:

    Msg 302, Level 16, State 0, Line 1
    The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
    

    1. 死ぬことのないゾンビPerfMonカウンター!

    2. MySQLに画像を保存するPHPかどうか?

    3. MySQL5.6EOLの発表

    4. TINYTEXT、TEXT、MEDIUMTEXT、およびLONGTEXTの最大ストレージサイズ