2009-02-07 5 views
2

Quelle requête serait la plus rapide?Optimisation de la clause SQL "ON"

SELECT * FROM topic_info 
    LEFT JOIN topic_data ON topic_info.id = topic_data.id 
WHERE id = ? 

ou

SELECT * FROM topic_info 
    LEFT JOIN topic_data ON topic_data.id = topic_info.id 
WHERE id = ? 

La différence est l'ordre des expressions sur la clause "ON": la première requête vérifie topic_info.id contre topic_data.id, la deuxième topic_data.id contre topic_info. Quelle requête serait généralement plus rapide?

(je sais soit requête n'analyser en raison de la colonne ambiguë « id », mais Ignorons que)

+0

le code pour une meilleure lisibilité – jandersson

Répondre

4

Je ne pense pas qu'il devrait faire une différence. Choisissez une convention et respectez-la.

2

Les db modernes sont suffisamment intelligents pour que cela ne nuise pas aux performances d'exécution.

+0

Je ne pense pas que « débrouillardise » et « moderne BDs » ont quelque chose à voir avec elle. C'est plus que "a = b" et "b = a" sont mathématiquement/logiquement équivalents. – Tomalak

+0

oh oui ... c'est le cas. Si a = 1M enregistrements et b = 3M enregistrements, la façon dont vous évaluez vos jointures est importante. Auparavant, la séquence des jointures importait dans les requêtes (vous pouviez le voir dans le plan d'exécution en train de changer). Maintenant non. – Learning

3

Il probablement n'a pas d'importance, mais le tester. Si vous utilisez MySQL, essayez 'Expliquer select ...' - cela vous dira ce que vous devez savoir.

2

Ne vont-ils pas donner des résultats légèrement différents? Comme il s'agit d'une jointure à gauche, s'il y a des lignes dans l'une des tables sans les enregistrements liés dans l'autre, elles ne seront pas récupérées lorsque cette table est à droite de la clause de jointure.

Ou ai-je mal compris?

EDIT: J'ai mal compris complètement - je viens de faire quelques tests. Ta aux commentateurs pour me remettre d'aplomb.

+0

L'ordre de jointure ne change pas. 'FROM topic_info LEFT JOIN topic_data' et' FROM topic_data LEFT JOIN topic_info' * retournera des résultats différents. –

+0

À droite, l'OP ne modifie que l'ordre des termes de la clause ON. L'égalité est commutative, donc le résultat serait le même. La seule différence pourrait être dans la façon dont le moteur SQL choisit les index. –

+0

Comme je l'ai mentionné ... – Wayne

3

Les autres affiches sont correctes, peu importe dans quel sens vous exprimez la jointure.

Ceci est parce que l'optimiseur de requête va déterminer la méthode la plus efficace et bien sûr plan de requête à utiliser pour votre requête. Cela se produira indépendamment de votre commande de déclaration de jointure.

Espérons que cela clarifie les choses pour vous s'il vous plaît n'hésitez pas à demander des détails supplémentaires.

Cheers, tiret John

Questions connexes