8
votes

Sont des jointures sur un FK plus rapidement que des jointures sans FK?

Dire que j'ai deux tables, a code> et b code>:

FROM a
JOIN b on a.fk = b.pk


0 commentaires

3 Réponses :


6
votes

Meilleure pratique
  1. Les clés étrangères sont une intégrité relationnelle outil , pas un outil de performance. Vous devez toujours créer des index sur des colonnes FK pour réduire les recherches. SQL Server ne le fait pas automatiquement.
  2. Comme indiqué ici ici Touches étrangères Boost Performance

    Logiquement, cela donne à la suite de la performance de classement Wise
    1. a.fk est configuré pour être une clé étrangère sur b.pk - b.pk est indexé
    2. Il n'y a pas de relation entre les tables - b.pk est indexé
    3. a.fk est configuré pour être une clé étrangère sur b.pk - b.pk n'est pas indexé
    4. Il n'y a pas de relation entre les tables - b.pk n'est pas indexé


3 commentaires

Merci! Très utile. Une idée de la grande différence de performance entre 1 et 2 (dans votre classement) serait?


Négligible si du tout, il y aurait une différence.


Le lien est cassé.



1
votes

Les différend de performance seraient plus grandes entre les versions indexées et non indexées, cependant, que ce soit plus rapide ou plus lente dépendrait de savoir s'il s'agissait d'une sélection ou d'un insert. Avoir des index et des contraintes de clés étrangères ralentissez les inserts, mais la vitesse sélectionnée sélectionne (l'index) ou rendre les données plus fiables (la FK). Étant donné que la plupart des inserts ne sont généralement pas ralentis (sauf si vous faites de gros inserts en vrac), il est généralement de votre mieux l'intérêt d'avoir le FK et l'index.


0 commentaires

1
votes

Je vais savoir la réponse de Lieven. Juste pour répondre à votre question de bonus de la quantité de performance que vous obtenez de créer un index, la réponse est «qui dépend».

Si une ou les deux tables sont petites et ce sont les deux seules tables de la requête, le gain de performance pourrait être petit à zéro. Lorsque le nombre d'enregistrements est petit, il est parfois plus rapide de simplement lire tous les enregistrements plutôt que d'utiliser l'index de toute façon. Le moteur de base de données devrait être suffisamment intelligent pour comprendre cela - c'est ce que "optimisation de la requête est tout à propos de".

De même, si vous avez d'autres tables impliquées et d'autres critères de sélection, le moteur DB peut décider de ne pas utiliser cet index et qu'une autre façon de trouver les enregistrements est plus rapide.

À l'autre extrême, si vous avez deux très grandes tables, la création d'un index sur le champ utilisé pour les rejoindre peut couper le temps d'exécution de 99% ou plus.

C'est pourquoi c'est une bonne idée d'apprendre à lire les plans d'explication sur votre moteur DB. Si une requête prend beaucoup de temps, courez le plan d'explication et voyez ce que cela fait. Souvent, la création d'un bon index peut améliorer considérablement une requête.


0 commentaires