2010-09-15 13 views
3

J'ai une requête T-SQL qui provoque des problèmes de performances. C'est un gros morceau mais la partie qui semble causer un problème est un simple joint gauche. Cela peut être résolu en supprimant la jointure gauche et en utilisant une sous-requête dans la sélection, mais cela ne me semble pas satisfaisant car je ne vois pas pourquoi on travaille rapidement et pas l'autre.Problème étrange avec la jointure gauche et la sous-requête dans la sélection

Il n'y a pas beaucoup de données impliquées et il y a des clés/index sur toutes les colonnes de jointure. La seule autre chose que je me demandais concernait les statistiques sur la base de données et si elles affectaient la performance.

Par exemple (N.B. c'est juste une simplification d'une requête beaucoup plus complexe

LENT

SELECT A.1,A.2,B.3 FROM A LEFT JOIN B ON A.ID = B.ID ... 

FAST

SELECT A.1, A.2, (SELECT B.3 FROM B WHERE B.ID = A.ID) FROM A

+2

Quelles sont les principales différences dans les plans d'exécution? –

+0

Vous n'utilisez pas vraiment les nombres ordinaux pour choisir les colonnes êtes-vous? – HLGEM

+0

comme hlgem dit, quel est le reste de la première requête? – DForck42

Répondre

0

ces tw o les requêtes peuvent ne pas être équivalentes. Si votre sous-requête:

(SELECT B.3 FROM B WHERE B.ID = A.ID) 

renvoie plus d'une ligne, votre jointure gauche va juste retourner deux lignes, mais votre sous-requête soufflera se plaindre que « sous-requête retourné plus d'une ligne ». Si B.ID est unique, l'optimiseur le sait-il? Avez-vous une contrainte ou un index unique?

+0

Yup avait une contrainte unique sur elle – AJM

1

En général, une sous-requête serait généralement plus lente qu'une jointure gauche, il doit donc y avoir quelque chose d'autre qui se passe.

Afficher d'abord l'ensemble de la requête que le problème peut être une partie que vous avez utilisé le ... pour représenter.

Ensuite, vérifiez vos plans d'exécution et voyez quelle est la différence. Et êtes-vous absolument sûr qu'il y a un index sur la colonne id. Les contraintes FK n'obtiennent pas automatiquement les index créés.

Les deux requêtes renvoient-elles les mêmes enregistrements? On peut être plus rapide parce que ce n'est pas l'équivalent de l'autre.

+0

Je suis raisonnablement sûr que le prolem n'est pas dans le ... comme le ... a été en production pendant un moment c'est juste la partie au-dessus qui a changé. – AJM

+0

Ont également des index explicites et ont vérifié que la requête renvoie les mêmes enregistrements. – AJM

+1

@AJM - Je n'abandonnerais pas ... la partie si rapidement. Une sous-requête dans la clause SELECT sera traitée logiquement après le traitement de tous les éléments de la clause FROM. Lorsque vous placez LEFT OUTER JOIN dans la clause FROM, il est traité au milieu de tous les éléments FROM. Le plan d'exécution va le montrer. – bobs