Il n'y a rien de mal avec GUID en tant que clés et clusters dans un système OLTP (sauf si vous avez BEAUCOUP d'index sur la table qui souffrent de l'augmentation de la taille du cluster). En fait, ils sont beaucoup plus évolutifs que les colonnes IDENTITY.
Il y a une croyance répandue que les GUID sont un gros problème dans SQL Server - en grande partie, c'est tout simplement faux. En fait, le GUID peut être considérablement plus évolutif sur les boîtes avec plus d'environ 8 cœurs:
Je suis désolé, mais vos développeurs ont raison. Souciez-vous d'autres choses avant de vous soucier du GUID.
Oh, et enfin: pourquoi voulez-vous un index de cluster en premier lieu? Si votre problème est un système OLTP avec beaucoup de petits index, vous êtes probablement mieux avec un tas.
Voyons maintenant ce que la fragmentation (que le GUID introduira) fait à vos lectures. Il y a trois problèmes majeurs avec la fragmentation:
- La page divise les E / S du disque de coût
- Les demi-pages pleines ne sont pas aussi efficaces en mémoire que les pages complètes
- Cela entraîne le stockage des pages dans le désordre, ce qui rend les E / S séquentielles moins probables
Étant donné que votre préoccupation dans la question concerne l'évolutivité, que nous pouvons définir comme «l'ajout de matériel accélère le système», ce sont les moindres problèmes. Pour aborder chacun à son tour
Annonce 1) Si vous voulez évoluer, vous pouvez vous permettre d'acheter des E / S. Même un SSD Samsung / Intel 512 Go bon marché (à quelques USD / Go) vous permettra de dépasser les 100 000 IOPS. Vous ne consommerez pas cela de sitôt sur un système à 2 prises. Et si vous rencontrez cela, achetez-en un de plus et vous êtes prêt
Annonce 2) Si vous supprimez votre tableau, vous aurez quand même des pages à moitié pleines. Et même si vous ne le faites pas, la mémoire est bon marché et pour tous, sauf les plus grands systèmes OLTP - les données chaudes devraient y tenir. La recherche de plus de données dans des pages est une sous-optimisation lorsque vous recherchez une échelle.
Annonce 3) Une table construite à partir de données fréquemment fragmentées et très fragmentées effectue des E / S aléatoires exactement à la même vitesse qu'une table remplie séquentiellement
En ce qui concerne la jointure, il existe deux principaux types de jointures que vous êtes susceptible de voir dans une charge de travail de type OLTP: Hash and loop. Regardons chacun à son tour:
Jointure par hachage: une jointure par hachage suppose que la petite table est analysée et que la plus grande est généralement recherchée. Les petites tables sont très probablement en mémoire, donc les E / S ne sont pas votre problème ici. Nous avons déjà évoqué le fait que les recherches ont le même coût dans un indice fragmenté que dans un indice non fragmenté
Jointure de boucle: la table externe sera recherchée. Même coût
Vous pouvez également avoir beaucoup de mauvaises analyses de table en cours - mais le GUID n'est à nouveau pas votre problème, une bonne indexation l'est.
Maintenant, vous pouvez avoir des analyses de plage légitimes en cours (en particulier lors de la jonction sur des clés étrangères) et dans ce cas, les données fragmentées sont moins "compressées" par rapport aux données non fragmentées. Mais considérons les jointures que vous verrez probablement dans des données 3NF bien indexées:
Une jointure d'une table qui a une référence de clé étrangère à la clé primaire de la table qu'elle référence
L'inverse
Annonce 1) Dans ce cas, vous allez pour une seule recherche à la clé primaire - joindre n à 1. Fragmentation ou non, même coût (une recherche)
Annonce 2) Dans ce cas, vous vous joignez à la même clé, mais vous pouvez récupérer plusieurs lignes (recherche de plage). La jointure dans ce cas est de 1 à n. Cependant, la table étrangère que vous recherchez, vous recherchez la même clé, qui est tout aussi susceptible d'être sur la même page dans un index fragmenté que sur une index non fragmentée.
Considérez ces clés étrangères pendant un moment. Même si vous aviez "parfaitement" séquentiellement posé nos clés primaires - tout ce qui pointe vers cette clé sera toujours non séquentiel.
Bien sûr, vous exécutez peut-être une machine virtuelle dans un SAN dans une banque peu onéreuse et gourmande en processus. Ensuite, tous ces conseils seront perdus. Mais si tel est votre monde, l'évolutivité n'est probablement pas ce que vous recherchez - vous recherchez des performances et une vitesse / coût élevés - qui sont deux choses différentes.