Utilisez GUIDs lorsque vous devez considérer l'importation/l'exportation vers plusieurs bases de données. Les règles sont souvent plus faciles à utiliser que les colonnes spécifiant l'attribut IDENTITY lorsque vous travaillez avec un ensemble de données de plusieurs relations enfants. En effet, vous pouvez générer aléatoirement des guids dans le code dans un état déconnecté de la base de données, puis soumettre tous les changements en même temps. Lorsque les guids sont générés correctement, ils sont insoutenables à dupliquer par hasard. Avec les colonnes d'identité, vous devez souvent insérer une insertion initiale d'une ligne parente et demander sa nouvelle identité avant d'ajouter des données enfant. Vous devez ensuite mettre à jour tous les enregistrements enfants avec la nouvelle identité parent avant de les valider dans la base de données. La même chose vaut pour les petits-enfants et ainsi de suite dans la hiérarchie. Cela crée beaucoup de travail qui semble inutile et banal. Vous pouvez faire quelque chose de similaire à Guids en entrant des entiers aléatoires sans la spécification IDENTITY, mais le risque de collision augmente considérablement lorsque vous insérez plus d'enregistrements au fil du temps. (Guid.NewGuid() est similaire à un Int128 aléatoire - qui n'existe pas encore). J'utilise Byte (TinyInt), Int16 (SmallInt), Int32/UInt16 (Int), Int64/UInt32 (BigInt) pour les petites listes de recherche qui ne changent pas ou les données qui ne sont pas répliquées entre plusieurs bases de données. (Autorisations, configuration de l'application, noms de couleurs, etc.)
J'imagine que l'indexation est aussi longue à interroger, que vous utilisiez un guid ou un long. Il y a généralement d'autres champs dans les tables qui sont indexés de plus de 128 bits (noms d'utilisateur dans une table utilisateur par exemple). La différence entre Guids et Integer est la taille de l'index en mémoire, ainsi que le remplissage et la reconstruction des index. La majorité des transactions de base de données est souvent en lecture. L'écriture est minime. Concentrez-vous d'abord sur l'optimisation de la lecture de la base de données, car ils sont généralement constitués de tables jointes qui n'ont pas été optimisées correctement, d'une pagination incorrecte ou d'index manquants.
Comme pour tout, la meilleure chose à faire est de prouver votre point. créer une base de données de test avec deux tables. Un avec une clé primaire d'entiers/longs, et l'autre avec un guid. Remplissez chacun avec des rangées N-Million. Surveiller les performances de chacun lors des opérations CRUD (créer, lire, mettre à jour, supprimer). Vous pouvez découvrir qu'il a un impact sur la performance, mais insignifiant.
Les serveurs s'exécutent souvent sur des boîtes sans environnements de débogage et autres applications prenant le processeur, la mémoire et les E/S du disque dur (en particulier avec RAID). Un environnement de développement ne vous donne qu'une idée de la performance.
"J'ai été informé que pour des raisons d'indexation, en utilisant un GUID est une mauvaise idée" - Si vous avez un index clusterisé sur votre domaine d'identité, un GUID nuira à la performance des insertions. SQL Server stocke la table dans un ordre basé sur l'index cluster. Comme les nouveaux GUID ne sont pas séquentiels, l'insertion d'une nouvelle ligne devra être insérée au milieu de la table plutôt qu'à la fin, provoquant beaucoup d'E/S. Tant que le type de colonne d'index clusterisé évite ce problème. – adrianbanks
juste pour ajouter - si le GUID est la clé primaire, alors par défaut le GUID sera mis en cluster - ceci peut être non-cluster, mais nécessite une intervention manuelle –
Voir http://sqlblogcasts.com/blogs/martinbell/archive/2009/ 05/25/GUID-Fragmentation-dans-SQL-Server.aspx - et http://www.dotnetrocks.com/default.aspx?showNum=455 pour un podcast avec beaucoup de contenu sur le sujet. –