TOUT À FAIT. Une correspondance de hachage serait une énorme amélioration. Créer le hachage sur la plus petite table de 19 223 lignes, puis l'explorer avec la plus grande table de 65 991 lignes est une opération beaucoup plus petite que la boucle imbriquée nécessitant 1 268 544 993 comparaisons de lignes.
La seule raison pour laquelle le serveur choisirait les boucles imbriquées est qu'il a largement sous-estimé le nombre de lignes impliquées. Vos tableaux contiennent-ils des statistiques à leur sujet et, si oui, sont-ils mis à jour régulièrement ? Les statistiques sont ce qui permet au serveur de choisir de bons plans d'exécution.
Si vous avez correctement traité les statistiques et que vous rencontrez toujours un problème, vous pouvez le forcer à utiliser une jointure HASH comme suit :
SELECT *
FROM
TableA A -- The smaller table
LEFT HASH JOIN TableB B -- the larger table
Veuillez noter qu'au moment où vous faites cela, cela forcera également l'ordre de jointure. Cela signifie que vous devez organiser correctement toutes vos tables afin que leur ordre de jointure ait un sens. En règle générale, vous examinerez le plan d'exécution que le serveur possède déjà et modifierez l'ordre de vos tables dans la requête en conséquence. Si vous ne savez pas comment procéder, les bases sont que chaque entrée "gauche" vient en premier, et dans les plans d'exécution graphiques, l'entrée gauche est la inférieure une. Une jointure complexe impliquant de nombreuses tables peut devoir regrouper les jointures entre parenthèses ou utiliser RIGHT JOIN
afin que le plan d'exécution soit optimal (intervertissez les entrées gauche et droite, mais introduisez la table au bon endroit dans l'ordre de jointure).
Il est généralement préférable d'éviter d'utiliser des indices de jointure et de forcer l'ordre de jointure, alors faites tout ce que vous pouvez en premier ! Vous pouvez examiner les index sur les tables, la fragmentation, la réduction de la taille des colonnes (comme l'utilisation de varchar
au lieu de nvarchar
où Unicode n'est pas requis), ou en divisant la requête en plusieurs parties (insérez d'abord dans une table temporaire, puis joignez-la à celle-ci).