SQL Server les performances de la requête - la suppression besoin de Hash Match (Inner Join)

J'ai la requête suivante, qui fait très peu et est un exemple du type de joint que je fais à travers tout le système.

select t1.PrimaryKeyId, t1.AdditionalColumnId
from TableOne t1
    join TableTwo t2 on t1.ForeignKeyId = t2.PrimaryKeyId
    join TableThree t3 on t1.PrimaryKeyId = t3.ForeignKeyId
    join TableFour t4 on t3.ForeignKeyId = t4.PrimaryKeyId
    join TableFive t5 on t4.ForeignKeyId = t5.PrimaryKeyId
where 
    t1.StatusId = 1
    and t5.TypeId = 68

Il existe des index sur toutes les colonnes de jointure, cependant, le rendement n'est pas grande. L'inspection du plan de requête révèle beaucoup de Hash Match (Jointures internes) quand vraiment je veux voir les jointures de Boucle Imbriquée.

Le nombre d'enregistrements dans chaque tableau est comme suit:

select count(*) from TableOne

= 64393

select count(*) from TableTwo

= 87245

select count(*) from TableThree

= 97141

select count(*) from TableFour

= 116480

select count(*) from TableFive

= 62

Quelle est la meilleure façon d'améliorer les performances de ce type de requête?

  • Avez-vous testé les performances à l'aide de jointures de boucle pour vérifier qu'il est une amélioration?
  • Devrait TableThree être l'alias t3? Et de le REJOINDRE pour TableThree, TableFour alors?
  • non, je n'ai pas, c'est une présomption actuellement. Je ne m'attends pas à cette requête de prendre du temps pour s'exécuter.
  • SQL Server intéresse aussi à la cardinalité lors du choix d'adhérer à la méthode. Vous pouvez essayer de OPTION (LOOP JOIN) et regarder le plan et la performance.
  • oui, désolé, c'est corrigé.
  • peel: Est TableFour t4 sur t2.ForeignKeyId = t4.PrimaryKeyId bon maintenant? Et TableThree t3 on t1.PrimaryKeyId = t3.ForeignKeyId?
  • oui c'est bon maintenant.

InformationsquelleAutor Tim Peel | 2011-08-28