Je sais que ce type de question revient souvent, mais je n'ai pas encore lu d'arguments convaincants pour m'aider à prendre cette décision. S'il vous plaît, supportez-moi!
J'ai une énorme base de données - elle augmente d'environ 10 000 000 d'enregistrements par jour. Les données sont relationnelles et pour des raisons de performances, je charge la table avec BULK COPY. Pour cette raison, je dois générer des clés pour les lignes et ne peux pas compter sur une colonne IDENTITY.
Un entier 64 bits - un bigint - est assez large pour moi, mais pour garantir l'unicité, j'ai besoin d'un générateur centralisé pour faire mes identifiants pour moi. J'ai actuellement un tel service de générateur qui permet à un service de réserver des numéros de séquence X et ne garantit aucune collision. Cependant, une conséquence de cela est que tous les services dont je dispose dépendent de ce seul générateur centralisé, et donc je suis limité dans la façon dont je peux distribuer mon système et je ne suis pas satisfait des autres dépendances (telles que la nécessité d'un accès au réseau) imposées par cette conception. Cela a parfois été un problème.
J'envisage maintenant d'utiliser des GUID séquentiels comme clés primaires (générées en externe pour SQL). Pour autant que j'ai pu le vérifier à partir de mes propres tests, le seul inconvénient est la surcharge d'espace disque d'un type de données plus large (qui est exacerbé par leur utilisation dans les index). Je n'ai vu aucun ralentissement perceptible des performances des requêtes, par rapport à l'alternative bigint. Le chargement de la table avec BULK COPY est légèrement plus lent, mais pas de beaucoup. Mes index basés sur GUID ne deviennent pas fragmentés grâce à mon implémentation séquentielle GUID.
Fondamentalement, ce que je veux savoir, c'est s'il y a d'autres considérations que j'ai pu ignorer. Pour le moment, je suis enclin à franchir le pas et à commencer à utiliser les GUID. Je ne suis en aucun cas un expert en bases de données, donc j'apprécierais vraiment tout conseil.