Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

NEWID() vs NEWSEQUENTIALID() dans SQL Server :Quelle est la différence ?

Dans SQL Server, à la fois le NEWSEQUENTIALID() fonction et le NEWID() créer un GUID (Globally Unique IDentifier), également appelé UUID (Universally Unique IDentifier).

Un GUID peut être utilisé comme identifiant unique dans les colonnes de type uniqueidentifier , les deux fonctions peuvent donc être utilisées à cette fin.

Cependant, il existe des différences entre ces deux fonctions qui peuvent influencer votre décision d'utiliser l'une plutôt que l'autre.

Les différences

Voici les principales différences entre ces deux fonctions.

NOUVEAUID() NEWSEQUENTIALID()
GUID Crée un GUID aléatoire. Crée un GUID séquentiel.
Approche Le GUID est conforme à la RFC 4122 version 4, qui spécifie que le GUID est généré de manière aléatoire ou pseudo-aléatoire. Crée un GUID supérieur à tout GUID précédemment généré par cette fonction sur un ordinateur spécifié depuis le démarrage de Windows. Après le redémarrage de Windows, le GUID peut recommencer à partir d'une plage inférieure, mais reste globalement unique.
Type de retour uniqueidentifier uniqueidentifier
Utilisation Peut être utilisé dans des requêtes ad hoc, des tables, des variables, etc Ne peut être utilisé qu'avec DEFAULT contraintes sur les colonnes de table de type uniqueidentifier .
Performances Peut être plus lent que NEWSEQUENTIALID() , car NEWID() provoque une activité aléatoire et utilise moins de pages de données mises en cache. Peut être plus rapide que NEWID() , car NEWID provoque une activité aléatoire et utilise moins de pages de données mises en cache. Utilisation de NEWSEQUENTIALID() aide également à remplir complètement les pages de données et d'index.
Sécurité Plus sécurisé, car le GUID est généré de manière aléatoire et plus difficile à deviner. Moins sécurisé. Il est possible de deviner la valeur du prochain GUID généré et, par conséquent, d'accéder aux données associées à ce GUID.

Je suis sûr qu'il y a beaucoup d'autres différences sous le capot, mais ce sont les principales différences du point de vue de l'utilisateur.

Exemple 1 - Comparaison des GUID

Voici un exemple rapide pour démontrer la différence dans le GUID produit par chacune de ces fonctions.

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

Résultat :

+--------------------------------------+--------------------------------------+
| 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 |
+--------------------------------------+--------------------------------------+

Nous pouvons voir que le NEWSEQUENTIALID() la colonne s'incrémente de manière séquentielle, alors que le NEWID() colonne semble être aléatoire.

Les deux colonnes contiennent des GUID et ils sont valides uniqueidentifier type.

Sur le NEWID() , nous pouvons voir que toutes les valeurs sont RFC 4122 version/(sous-type) 4, qui spécifie que le GUID est généré de manière aléatoire ou pseudo-aléatoire. Nous savons qu'il s'agit de la version 4 car le 4 se trouve à l'endroit approprié (toutes les lignes prennent la forme : xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx ).

Exemple 2 – Utilisation dans les requêtes

Comme mentionné, seul NEWID() peut être utilisé dans les requêtes.

Par exemple, vous pouvez faire ceci :

SELECT NEWID() AS [NEWID()];

Résultat :

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

Mais vous ne pouvez pas faire ceci :

SELECT NEWSEQUENTIALID() AS [NEWSEQUENTIALID()];

Résultat :

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.