6
votes

L'index en cluster sur la colonne de clé étrangère augmente-t-elle les performances de jointure vs non regroupées?

Dans de nombreux endroits, il est recommandé que des index en cluster soient mieux utilisés lorsqu'ils sélectionner pour sélectionner une plage de lignes à l'aide d'une déclaration. Lorsque je sélectionne une jointure par champ de clé étrangère de manière à ce que cet indice en clusterie soit utilisé, je suppose que cette clusterisation devrait également aider à l'autre, car la gamme de lignes est sélectionnée même si elles ont toutes une même valeur de clé en cluster et entre la même valeur de cluster et entre ne pas être utilisée. < / p>

Considérant que je me soucie que de savoir que l'on choisit avec une jointure et rien d'autre, je me trompe avec ma supposition?


0 commentaires

5 Réponses :


0
votes

Les gains de performance viennent généralement si vous sélectionnez des données séquentiellement dans le cluster. En outre, cela dépend entièrement de la taille de la table (données) et des conditions de votre déclaration.


0 commentaires

2
votes

Un index sur la colonne FK aidera la jointure car l'index lui-même est commandé: regroupement signifie simplement que les données sur le disque (feuille) sont commandées plutôt que l'arbre B.

Si vous le changez à un index de couverture, alors clustered vs non regroupé est hors de propos. Ce qui est important, c'est avoir un index utile.


2 commentaires

@GBN: Merci de votre réponse la plus précise, est-ce que ma compréhension est correcte que vous êtes en désaccord avec Marc_s et MJV, vous dites hors de propos, ils disent pertinents?


J'ai répondu à propos de KK Index: Marc_s a répondu à propos des index en clusters en général (et a commenté ma réponse trop positivement). MJV semble dire la même chose que moi.



1
votes

Cela dépend de la mise en œuvre de la base de données.

Pour SQL Server, un index en cluster est une structure de données où les données sont stockées en tant que pages et que des arbres B et sont stockés comme une structure de données distincte. La raison pour laquelle vous obtenez une performance rapide est que vous pouvez accéder au commencer de la chaîne rapidement et les gammes sont une liste liée facile à suivre.

Indices non clusters est une structure de données contenant des pointeurs sur les enregistrements réels et de telles préoccupations différentes.

Reportez-vous à la documentation concernant Structures d'index en clusters .

Un index n'aidera pas par rapport à une relation clé étrangère, mais cela aidera à cause du concept d'indice "couvert". Si votre clause d'où contient une contrainte basée sur l'index. Il sera capable de générer le jeu de données retourné plus rapidement. C'est là que vient la performance.


5 commentaires

Donc, ma question était de «démarrera rapidement la chaîne et les plages sont une liste lié facile» être utilisée dans Select avec Join par FK Field?


Pas par la jointure, mais par la clause WHERE. Si le FK et l'indice couvert et la contrainte où sont la même colonne, alors oui.


Donc, si j'utilise une colonne FK uniquement à l'intérieur de la jointure, mais pas à l'intérieur de l'endroit où regroupée vs non regroupée est hors de propos?


Surtout ... parce que si vous mettez une contrainte dans le x.c1 = y.c2 et (x.c1> = 30 et x.c1 <= 40), l'optimiseur peut utiliser l'index. Le poste de MJV ci-dessous résume correctement que c'est un cas par situation de cas. Le meilleur choix est d'utiliser le profileur et l'observateur. SQL Server utilise également un optimiseur de requête pouvant choisir de ne pas faire de choses que vous le pensez.


Et si je viens d'utiliser sur x.c1 = y.c2?



10
votes

Discuter de ce type de problème dans l'absolu n'est pas très utile.

C'est toujours une situation de cas par cas!

Essentiellement, Accès à titre d'un index en cluster permet d'économiser une indirection , période.

En supposant que la clé utilisée dans la jointure est celle de l'index en cluster, en une seule lecture [à partir d'un indice de recherche ou d'une analyse partielle ou partielle, pas d'importance], vous obtenez toute la ligne (enregistrement). .

Un problème avec des index en cluster, est que vous n'obtenez qu'un par table. Par conséquent, vous devez l'utiliser judicieusement. En effet, dans certains cas, il est même plus sage de ne pas utiliser d'index en cluster à cause d'insertion de frais généraux et de fragmentation (en fonction de la clé et de l'ordre des nouvelles clés, etc.)

Parfois, on obtient les avantages équivalents d'un indice en cluster, avec un index de couverture , c'est-à-dire un index avec la séquence de la clé (s) souhaitée, suivie des valeurs de colonne que nous sommes intéressés. Comme un index en cluster, un indice de couverture ne 't nécessite l'indirection de la table sous-jacente. En effet, l'indice de couverture peut être légèrement plus efficace que l'index en cluster, car il est plus petit.
Cependant, et aussi, comme des indices en clustered, et mis à part les frais généraux de stockage, il existe un coût de performance associé à tout index supplémentaire, lors de requêtes d'insertion (et de suppression ou de mise à jour) . .

et, oui, comme indiqué dans d'autres réponses, la "clé étrangère" de la clé utilisée pour l'indice en cluster, n'a absolument aucune incidence sur la performance de l'index. Les FKS sont des contraintes visant à faciliter le maintien de l'intégrité de la base de données, mais les champs sous-jacents (colonnes) sont autrement comme n'importe quel autre champ de la table.

pour prendre des décisions sages sur la structure de l'index, il faut

  • comprend la manière dont les différents types d'index (et le tas) fonctionnent
    (et, BTW, cela varie quelque peu entre les implémentations SQL)
  • avoir une bonne image du profil statistique de la ou des bases de données à la main:
    Quelles sont les grandes tables, qui sont les relations, quelle est la cardinalité moyenne / maximale de la relation, quel est le taux de croissance typique de la base de données, etc.
  • avoir une bonne idée de la manière dont la ou les bases de données est (sont) seront utilisées / interrogées

    Alors et seulement à ce moment-là, peut-on faire des suppositions éduquées sur l'intérêt [ou de son absence] d'avoir un index clustered donné.


6 commentaires

Changements de comportement. J'ai eu une requête optimisée et a fonctionné à sens unique dans SQL Server 2000, puis a échoué et a fonctionné différemment dans SQL Server 2005. Les absolus ne sont pas le cas car il peut être spécifique au fournisseur.


@ALPAV: En supposant que votre requête accède effectivement au moins un champ dans la table jointe (comme le cas probablement), la réponse courte est «Oui !, Le fait que l'indice en cluster est utilisé dans la requête que vous mentionne améliore la performance [comme Comparé à un indice ordinaire non cluster sur le PK] ". La réponse longue est "Il existe de nombreux autres facteurs; la requête pourrait éventuellement obtenir des gains de performances plus importants à partir d'autres sources; cela ne devrait pas être une approbation de cet index ou même des index en cluster en général; ..." Alors, oui, oui, votre cas était assez spécifique ...


... pour justifier une réponse précise techniquement , mais cela n'adresse probablement pas à la grande image. Aussi: ce n'était pas une plainte contre votre question, mais une remarque indiquant que l'exposition d'un contexte suffisant dans une brève question n'est pas facile de faire, d'où la semi-pertinence de Q / A à propos de SQL Performance sur ce forum .


@MJV: Oui, bien sûr que vous avez fait - très clairement et parfaitement. Désolé, mea cupla - je n'ai pas attrapé cette partie ...


@marc_s: NP, NO Mea Culpa nécessaire ;-) Je fais souvent un travail terrible pour expliquer les choses (voir ma photo avatar). J'ai également commencé à supprimer un commentaire sur cette question particulière pour que les choses soient soignées (puisque toutes sont couvertes de réponse).


@MJV: Aimez votre photo d'avatar :-)



3
votes

Je demanderais quelque chose d'autre: Serait-il sage de mettre mon index en cluster sur une colonne de clé étrangère juste pour accélérer une seule joindre? Cela aide probablement, mais ..... à un prix!

Un index en clusterde fait une table plus rapidement, pour chaque opération. OUI! Cela fait. Voir Kim Tripp's excellent Le débat sur l'index en cluster continue Pour les informations de fond. Elle mentionne également ses principaux critères pour un indice en cluster:

  • étroit
  • statique (jamais changements)
  • unique
  • Si jamais possible: toujours croissant

    Int Identity remplit ce parfaitement - le GUID n'est pas. Voir GUID comme principal Key pour des informations de fond étendues.

    pourquoi étroite? Parce que la clé de clustering est ajoutée à chaque page d'index de chaque index non clustered sur le même tableau (afin de pouvoir réellement rechercher la ligne de données , si besoin). Vous ne voulez pas avoir Varchar (200) dans votre clé de clustering ....

    Pourquoi unique ?? Voir ci-dessus - La clé de clustering est l'élément et le mécanisme que SQL Server utilise pour trouver de manière unique une ligne de données. Il doit être unique. Si vous choisissez une clé de clustering non unique, SQL Server lui-même ajoutera un actificateur de 4 octets à vos clés. Faites attention à ça!

    Donc, ce sont mes critères - mettez votre clé de clustering sur une colonne étroite, stable, unique et sans toutefois croissante. Si votre colonne de clé étrangère correspond à celles - parfaites!

    Cependant, je serais pas en aucune circonstance mettant ma clé de clustering sur une clé étrangère large ou même composée. N'oubliez pas que la valeur (s) de la clé de clustering est ajoutée à chaque entrée d'index non clustered sur cette table! Si vous avez 10 indices non clusters, 100 000 lignes de votre table - c'est-à-dire un million d'entrées. Cela fait une énorme différence, que ce soit un entier de 4 octets, ou un Varcharchar de 200 octets - énorme. Et pas seulement sur le disque - dans la mémoire du serveur également. Pensez très très soigneusement sur ce qu'il faut faire votre index en cluster!

    SQL Server peut avoir besoin d'ajouter un uniquifier - rendre les choses encore pire. Si les valeurs changeront jamais, SQL Server devrait faire beaucoup de comptabilité et de mise à jour sur tout le lieu.

    Donc en bref:

    • Mettre un index sur vos clés étrangères est définitivement une bonne idée - faites-le tout le temps!
    • Je ferais très attention à la fabrication d'un index en cluster. Tout d'abord, vous obtenez seulement un index en cluster, alors quelle relation FK allez-vous choisir? Et ne mettez pas la clé de clustering sur une colonne large et constante changeante

8 commentaires

@marc_s: Mon compréhension est-il correct que vous êtes en désaccord avec GBN, vous dites que la clusterisation est pertinente pour les jointures et GBN indique que ce n'est pas?


@alpav: Je ne pense pas que GBN dit que :-) Mais il souligne très correctement: le point le plus important est d'avoir un index sur vos colonnes de clé étrangère. Que ce soit en cluster ou non est secondaire.


Je sais que et la plupart de ce qui est mentionné dans toutes les autres réponses, mais je n'ai toujours pas eu de réponse claire sur ce que je ne sais pas - la clusterisation améliorera la vitesse des jointures sans entre,> =, <=. Je m'attendais à une réponse oui / non, pas d'éducation sur des indices en cluster et des clés étrangères, sinon il serait duplicata de nombreuses autres questions.


@ALPAV: Je ne pense pas que quiconque puisse dire à coup sûr, juste basé sur la théorie SQL Server. Il y a juste trop de facteurs en jeu que nous ne connaissons pas. Le seul moyen réel fiable de la découvrir est: mesure, changement, mesurer à nouveau, comparer. Désolé - SQL Server ESP. Le réglage de la performance n'est guère jamais un scénario "oui ou non" .....


@ALPAV: Si vous voulez que mon intestin sentiment pour "oui ou non" - mais c'est tout ce que c'est tout ce que c'est, pas de faits à la sauvegarder - je devrais dire "non, faire un tel index un index en clustere ne vous donnera aucune avantages". Mais encore une fois: juste un sentiment d'intestinaire, pas de données pour le sauvegarder.


Détail important: GUIDS peut un candidat pour les index de clustering, en fonction de la manière dont ils sont générés. Plusieurs algorithmes produisent des GUDS "séquentiels".


@MDESCHAEPMEESTER: Même si elles sont pseudo-séquentielles - elles sont toujours quatre fois comme gros comme un int et donc beaucoup moins optimal pour un index en clustere ... .


@marc_s C'est certainement un point valable, mais nous avons des scénarios pour justifier leur utilisation. Nous avons une table où des centaines à des centaines de documents sont créées quotidiennement avec une courte durée de vie, mais lorsqu'ils expirent, ils sont archivés à une autre table où ils sont conservés plus longtemps - d'où la nécessité de s'assurer que l'identité n'a pas bouclé d'ici pour toujours être capable d'identifier des archives de manière unique.