La fonction système NEWSEQUENTIALID est une nouvelle fonction de SQL Serveur 2005. Une des limitations des colonnes « Identity » est lorsque l’on a besoin d’un identifiant unique pour plusieurs tables, bases ou serveurs. Par exemple, si l’on a plusieurs filiales qui peuvent produire des commandes. Chaque filiale, possède sa table « Commandes » et vous ne voulez qu’un même numéro de commande puisse être commun à deux filiales.
Comme solution, on peut créer un numéro de commande composé de l’Id de la filiale + d’un numéro de commande, ou réserver une plage de
numéro pour chaque filiale ou se servir d’une « fontaine de nombres » centrale. Si le numéro de commande n’est pas destiné à être « utilisable par l’homme », alors une des solutions a employer est le GUID.Le GUIDs
le GUIDs (Globally Unique Identifiers) est une valeur binaire de 16 octets, créée grace un générateur de nombre pseudo-aléatoire. (il n’est plus fabriqué a partir de l’adresse MAC de la
carte réseau afin de garantir la vie privé des utilisateurs). Cette particuliarité fait qu’il est presque impossible qu’un GUID soit généré 2 fois. Bien qu’un GUID soit une valeur binaire, il est souvent représenté sous une forme hexadecimal, par exemple: dbbc2827-edf8-4a2d-92ad-c1e0059304d7.
Ce qui les rend approprié a la contraire d’unicité de notre table des Commandes.
Le problème est résolu si nous n’avons pas a nous préocuper des performances, notamments en cas d’insertion de gros volumes de lignes. Comme le GUID est crée à partir d’un générateur
pseudo-aléatoire, ils ne possèdent pas les mêmes avantages (ordre) que les colonnes de type « identity ».
Le modèle d’E/S passe de séquentiel à aléatoire quand on utilise le GUID à la place de la colonne « Identity ».
Non seulement le GUID necessite plus d’E/S pour localiser le point d’insertion dans l’index clustered (the index doit être lu depuis la racine à chaque insertion), il génére egalement une fragmentation beaucoup plus
importante, ce qui exige des defragmentation et des reindexation fréquente.
NEWSEQUENTIALID()
La nouvelle fonction NEWSEQUENTIALID() combine le meilleur des deux mondes.
NEWSEQUENTIALID() va généré un GUID avec une valeur plus élevé que la précédente crée.
Il y a quelque restrictions dans l’utilisation de la fonction NEWSEQUENTIALID:
– NEWSEQUENTIALID() peut être utilisé seulement avec des contraintes DEFAULT sur des colonnes de table de type uniqueidentifier
– Lorsque vous utilisez la fonction NEWSEQUENTIALID() dans des expressions DEFAULT, vous ne pouvez pas la combiner avec d’autres opérateurs scalaires
– La fonction NEWSEQUENTIALID() ne peut pas être référencée dans les requêtes.
Si la confidentialité des données pose un problème, n’utilisez pas cette fonction. Il est possible de deviner la valeur du GUID généré suivant et donc d’accéder aux données qui lui sont associées.
Les performances
Pour tester les performances entre
-IDENTITY(,)
-NEWID()
-NEWSEQUENTIALID()
On insère 100.000 lignes dans une table avec chaqune des 3 methodes. A chaque execution, on va regarder les indicateurs suivants : E/S et fragmentation. ce qui nous donne le résultat suivant :
1 commentaire reçu(s)
Laisser une réponse