11
votes

GUID primaire / étranger Key Dilemma SQL Server

Je suis confronté au dilemme de changer mes principales clés des identités int. Je vais mettre mon problème tout de suite. C'est une application de gestion de détail typique, avec une fonctionnalité de point de vente et de back-office. A environ 100 tables. La base de données se synchronise avec d'autres bases de données et reçoit / envoie de nouvelles données.

La plupart des tables n'ont pas de fréquents inserts, mises à jour ou sélectionnent des instructions qui s'exécutent sur eux. Cependant, certains ont des insertions fréquentes et sélectionnent sur eux, par exemple. Tables de produits et commandes.

Certaines tables ont jusqu'à 4 clés étrangères. Si j'ai changé mes clés principales de "INT" à "GUID", il y aurait une question de performance lors de l'insertion ou de l'interrogation de données des tables qui ont de nombreuses clés étrangères. Je sais que les gens ont déclaré que les indices seront fragmentés et 16 octets est un problème.

L'espace ne serait pas un problème dans mon cas et une fragmentation apparemment d'index peut également être prise en charge de la fonction 'nouvelle suite (). Est-ce que quelqu'un peut me dire, de son expérience, si GUID sera problématique dans des tables avec de nombreuses clés étrangères.

Je serai très appréciatif de vos pensées sur elle ...


0 commentaires

6 Réponses :


3
votes

inconvénient d'utiliser le GUID sur INT:

Les valeurs de chaîne ne sont pas aussi optimales que les valeurs entières pour les performances lorsqu'elles sont utilisées dans des jointures, des index et des conditions. Plus d'espace de stockage est nécessaire que INT.

Les GUDS générés doivent être partiellement séquentiels pour les meilleures performances (par exemple, la nouvelle suite () sur SQL 2005) et pour permettre l'utilisation d'index en clusters

Pour plus de détails:

http: //www.codinghorrorror .com / Blog / 2007/03 / Primary-Keys-IDS-Versus-Guids.html

http: // blog.sqlauthority.com/2010/04/28/sql-server-guid-vs-int-your-opinion/


1 commentaires

Dans les GUIDS SQL Server sont stockés sous forme d'entiers 128 bits, pas de chaînes. Mais toujours, c'est 4 fois plus grand que l'int.



0
votes

Utiliser GUID ou INT pour PK dépend vraiment du scénario. Il y aura un coup de performance changeant de Int vers GUI. GUID est 4 fois plus grand qu'un int. Il y a un bon article ici sur les avantages et les inconvénients de l'utilisation de GUID.

Pourquoi devez-vous quand même changer d'entiers?


0 commentaires

0
votes

Les GUID ont un impact sur la performance relative à l'INT, mais cet impact peut être minimal en fonction de votre application, il n'ya donc aucun moyen d'être certain sans test. Une fois, j'ai converti une fois sur une application de l'INTS sur GUDS avec de très grandes tables avec de nombreuses clés étrangères faisant à la fois des modifications et des requêtes très lourdes (sur l'ordre de centaines de milliers de documents qui se retournent quotidiennement.) Les choses étaient plus lentes lorsqu'elles sont passées à travers un profileur , mais il n'y avait pas de différence notable du point de vue de l'utilisateur.

La réponse est donc "cela dépend". Comme toutes les choses traitant de la performance, vous ne pouvez pas vraiment être sûr que vous l'essayez.


0 commentaires

28
votes

GUIDS peut sembler être un choix naturel pour votre clé principale - et si vous le devez vraiment, vous pouvez probablement continuer à l'utiliser pour la clé primaire de la table. Ce que je recommandais vivement ne pas faire utilise la colonne GUID comme clé de clustering , laquelle SQL Server effectue par défaut, à moins que vous ne le disiez spécifiquement de ne pas.

Vous devez vraiment garder deux problèmes:

1) La clé primaire est une construction logique - l'une des clés candidates identifie de manière unique toutes les rangées de votre table. Cela peut être quelque chose, vraiment - un INT, un GUID, une chaîne - choisissez ce qui a le plus de sens pour votre scénario.

2) la touche de clustering (la colonne ou les colonnes qui définissent l'index en cluster sur la table) - c'est un physique physique lié ​​au stockage, et ici , un petit type de données stable, stable et toujours croissant est votre meilleur choix - Int ou Bigint comme option par défaut.

Par défaut, la clé principale d'une table SQL Server est également utilisée comme clé de clustering - mais cela n'a pas besoin d'être de cette façon! J'ai personnellement vu des gains de performances massives lors de la rupture de la clé principale / clustée principale basée sur le guid précédent en deux touches distinctes - la clé principale (logique) du GUID et de la clé de clustering (commande) sur une identité intégrée distincte (1, 1) colonne.

comme Kimberly Tripp - la reine de l'indexation - et d'autres ont déclaré beaucoup de fois - un GUID car la clé de clustering n'est pas optimale, car elle entraînera une fragmentation massive de page et d'index et généralement mauvaises Performance.

oui, je sais - il y a nouvelle suite () dans SQL Server 2005 et up - mais même ce n'est pas vraiment et totalement séquentiel et souffre ainsi des mêmes problèmes que le GUID - juste un peu moins en évidence donc.

Ensuite, il y a un autre problème à considérer: la clé de clustering sur une table sera ajoutée à chaque entrée de chaque index non clustered de votre table. Ainsi, vous voulez vraiment vous assurer que c'est aussi petit que possible. . En règle générale, une INT avec 2 milliards de lignes devrait être suffisante pour la grande majorité des tableaux - et comparé à un guid comme clé de clustering, vous pouvez épargner des centaines de mégaoctets de stockage sur disque et dans la mémoire du serveur.

Calcul rapide - Utiliser Int contre le GUID comme clé primaire et de clustering:


0 commentaires

1
votes

Ma prise est la suivante: utilisez Autooincrerement Int comme Pk à l'intérieur et disposez d'une colonne de gestion unique sur chaque table principale que vous utilisez pour déplacer des lignes sur les bases de données.

Rejoignez cette colonne lorsque vous exportez des données, n'exportez pas l'INT et de la modifier sur INT lorsque vous importez des données.

Surtout dans les grands volumes, INT sont beaucoup plus petits et plus rapides.


0 commentaires

-1
votes

Bence Eğer Benzersiz Bir Kod Kullhanmamız Gerekli Durumlarda Kullanılabilir. Ama Performansa Etkisinin Göz Önünde Bulundurulmalıdır. Identity bir pk ve fk olarak kullanırken interprète açısından daha iyidir. Bu Yüzden Duruma Bağlı Olarak Guid Ya Kuy Kullanımı Yapabiliriz.


1 commentaires

S'il vous plaît poster votre réponse en anglais