Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

choix de l'opérateur de l'optimiseur de requête - boucles imbriquées vs correspondance de hachage (ou fusion)

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