J'ai une table SQLServer qui stocke des détails de l'employé, l'ID de colonne est de type GUID pendant que la colonne utilise le remplacement du type INT. La plupart du temps, je traiterai de l'emploi dans le champ d'emploi tout en faisant des jointures et de sélectionner des critères. P>
Ma question est de savoir s'il est raisonnable d'attribuer une colonne d'identification primaire à la colonne ID tandis que Clusteredindex à l'emploi de l'emploi? P>
6 Réponses :
Tout d'abord, je dois dire que j'ai des ingulsions sur le choix d'un guid comme clé primaire de ce tableau. Je suis d'avis que l'employé serait probablement un meilleur choix, et quelque chose de naturellement unique à propos de l'employé serait meilleur que celui, tel qu'un SSN (ou ATIN), que les employeurs doivent obtenir légalement de toute façon (au moins aux États-Unis). p>
Mise à côté, vous ne devez jamais baser un index en cluster sur une colonne de gestion. L'indice en cluster spécifie l'ordre physique des rangées dans la table. Étant donné que les valeurs du GUID sont (en théorie) complètement aléatoires, chaque nouvelle ligne tombera à un endroit aléatoire. C'est très mauvais pour la performance. Il y a quelque chose appelé GUID "séquentiels", mais je vais considérer cela un peu de hack. P>
Index en cluster, car les données seront physiquement stockées dans cet ordre. Pour cette raison lorsque des tests pour des plages de lignes consécutives, des index en clusters aident beaucoup. p>
GUID est vraiment mauvais index en cluster depuis que leur commande n'est pas dans un modèle sensible pour commander. Int Identité colonnes ne sont pas beaucoup mieux, à moins que l'ordre d'entrée aide (par exemple, les embauches les plus récentes) p>
Puisque vous ne cherchez probablement pas des gammes d'employés, cela n'a probablement pas beaucoup d'importance que l'indice en cluster, à moins que vous ne puissiez les blocs d'employés que vous n'êtes souvent pas intéressé (par exemple, dates de terminaison) P. >
Les GUID peuvent être utilisés avec succès en tant qu'index clusters tant que vous utilisez la fonction nouvelleEncidental () pour les générer; Cela a ses propres problèmes que vous pouvez alors utiliser une seule machine pour garantir leur séquentiel. Mais je suis d'accord avec vos autres points qu'il vaut mieux trouver une clé naturelle si possible.
La clé d'index clustere idéale est la suivante: p>
En général, il s'agit d'une très mauvaise idée forte> d'utiliser un GUID en tant que clé d'index en clustere, car elle conduit à une fragmentation masso car les lignes sont ajoutées. P>
dans Applications pratiques forts> Dans ma propre expérience, le même domaine que votre PK devrait / serait votre clé en cluster, car elle répond aux mêmes critères énumérés ci-dessus. P>
Je suis tout à fait sûr que la déclaration "... Votre PK sera votre clé en cluster dans SQL Server ..." n'est pas exactement correcte. Un index en cluster peut être basé sur une clé unique, par exemple. Sinon, j'aime votre réponse.
Vous pouvez également utiliser un GUID séquentiel (nouveau) si vous avez besoin des avantages de l'unicité mondial.
La clé principale ne doit pas nécessairement être regroupée. Voir les commentaires sur la question.
Étant donné que EmaileenBumber est unique, je le ferais le pk. Dans SQL Server, un PK est souvent un indice en cluster. P>
Les jointures sur Guids sont juste horribles. @Jnk répond à ce bien. P>
Hmm. Comme en témoigne plusieurs commentaires et post sur cette question, il semble qu'il existe une idée fausse commune que les clés principales sont toujours regroupées ou le seul choix d'index en cluster. Comme je (et Remus) a souligné ailleurs, ce n'est pas le cas.
Oui, il est possible d'avoir une clé primaire non clustée et il est possible d'avoir une clé en cluster entièrement non liée à la clé primaire. Par défaut, une clé principale devient également la clé d'index en clustere, mais ce n'est pas une exigence. P>
La clé principale est un concept logique: est la clé utilisée dans votre modèle de données pour faire référence aux entités de référence.
La clé d'index en cluster est un concept physique: est l'ordre dans lequel vous souhaitez que les lignes soient stockées sur le disque. P>
Choisir une autre clé en cluster est entraînée par une variété de facteurs, comme une clé Ce sujet a déjà été discuté ici NAUSEAM avant, voir aussi Dans quelle colonne l'indice en clusterie doit-il être mis? . P> DATE entre '20100101' et '20100201' code> (une clé d'index en cluster sur
date code> serait appropriée). p>
Utiliser un indice encombré sur autre chose que la clé principale améliorera les performances sur la requête SELECT qui profitera de cet index. P>
Mais vous perdrez des performances sur la requête de mise à jour, car dans la plupart des scénarios, ils s'appuient sur la clé primaire pour trouver la ligne spécifique que vous souhaitez mettre à jour. p>
Créer une requête pourrait également perdre des performances car lorsque vous ajoutez une nouvelle ligne au milieu de l'index, beaucoup de lignes doivent être déplacées (physiquement). Cela ne se produira pas sur une clé primaire avec une augmentation de nouvel enregistrement sera toujours ajoutée à la fin et ne fera aucune autre ligne. P>
Si vous ne savez pas quel type d'opération nécessitent le plus de performances, je vous recommande de quitter l'index en cluster sur la clé principale et d'utiliser l'indice non clusterné sur les critères de recherche courants. p>
@Lamak: Je suis tout à fait sûr que ce n'est pas correct. Il ne peut s'agir que d'un index en cluster sur une table, mais il n'est pas nécessaire d'être sur la clé primaire.
@Lamak: incorrect. Les clés principales et les clés d'index en cluster sont sans rapport.
Oui, c'est vrai, mon mauvais. Une clé primaire crée automatiquement un index en cluster s'il n'y a pas d'autre index en cluster déjà sur cette table.
@Lamak Votre déclaration n'est pas vraie. La clé principale d'une base de données SQL Server ne doit pas nécessairement être regroupée. Lorsque vous créez des contraintes de colonne, vous pouvez spécifier la clé primaire non clusteriée, puis appliquer un index en cluster sur une autre colonne. ( MSDN.MICROSOFT.COM/EN-US/ Bibliothèque / AA258255 (V = SQL.80) .aspx )
Les données des bureaux de succursales seront synchronisées avec le siège social, dans ce cas, le seul type de PK fiable s'est révélé être GUID. Ce que je pouvais comprendre de toutes vos réponses, c'est que, n'utilisez jamais d'index en cluster sur les GUID, ce qui rend définitivement la colonne la plus appropriée d'index en cluster, tandis que PK pour ID.
Juste pour renforcer la lumière sur ceci, dans SQL Server, je pense que la clé principale est utilisée par défaut i> comme indice en cluster, mais comme d'autres personnes ont mentionné, l'index en cluster peut être spécifié sur des colonnes autres que la clé primaire.