11
votes

Les touches principales doivent-elles toujours être attribuées sous forme d'index en cluster

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.

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?


6 commentaires

@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 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.


6 Réponses :


2
votes

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).

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.


0 commentaires

0
votes

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.

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)

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)


1 commentaires

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.



9
votes

La clé d'index clustere idéale est la suivante:

  1. séquentielle
  2. sélectif (pas de dupes, unique pour chaque enregistrement)
  3. étroit
  4. utilisé dans les requêtes

    En général, il s'agit d'une très mauvaise idée d'utiliser un GUID en tant que clé d'index en clustere, car elle conduit à une fragmentation masso car les lignes sont ajoutées.

    Modifier pour plus de clarté:

    pk et clé en cluster sont en effet des concepts distincts . Votre PK n'a pas besoin d'être votre clé d'index en cluster.

    dans Applications pratiques 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.


3 commentaires

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.



0
votes

Étant donné que EmaileenBumber est unique, je le ferais le pk. Dans SQL Server, un PK est souvent un indice en cluster.

Les jointures sur Guids sont juste horribles. @Jnk répond à ce bien.


1 commentaires

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.



11
votes

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.

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.

Choisir une autre clé en cluster est entraînée par une variété de facteurs, comme une clé largeur lorsque vous désirez une clé en cluster plus étroite que la clé principale (car la clé en cluster est répliquée dans tous les < / em> index non clustered. ou Prise en charge des analyses fréquentes SCAN (série courante dans TIME) lorsque les données sont fréquemment accessibles à des requêtes telles que DATE entre '20100101' et '20100201' (une clé d'index en cluster sur date serait appropriée).

Ce sujet a déjà été discuté ici NAUSEAM avant, voir aussi Dans quelle colonne l'indice en clusterie doit-il être mis? .


0 commentaires

0
votes

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.

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.

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.

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.


0 commentaires