J'ai deux exemples suivants.
1. Exemple (OERE)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id
WHERE t2.field = true
2. Exemple (JOIN AND)
SELECT 1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id AND t2.field = true
Quel est le moyen le plus rapide en termes de performances? Que préfères-tu?
Si un filtre entre fonctionnellement dans une condition JOIN
(c'est-à-dire qu'il s'agit d'une condition de jointure réelle, pas seulement d'un filtre), il doit apparaître dans la clause ON
de cette jointure.
À noter:
Si vous le placez à la place dans la clause WHERE
, les performances sont les mêmes si la jointure est INNER
, sinon elle diffère. Comme mentionné dans les commentaires, cela n'a pas vraiment d'importance car de toute façon le résultat est différent.
Le fait de placer le filtre dans la clause WHERE
lorsqu'il s'agit réellement d'une condition OUTER JOIN
Annule implicitement la nature OUTER
de la condition ("joindre même quand il n'y a pas d'enregistrements") car ceux-ci les filtres impliquent qu'il doit y avoir des enregistrements existants en premier lieu. Exemple:
... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5
Est correct
... table1 t LEFT JOIN table2 u ON ...
WHERE t2.column = 5
est incorrect, car t2.column = 5
indique au moteur que des enregistrements de t2 sont attendus, ce qui va à l'encontre de la jointure externe. Une exception à cela serait un filtre IS NULL
, Tel que WHERE t2.column IS (NOT) NULL
(qui est en fait un moyen pratique de construire des jointures externes conditionnelles)
LEFT
et RIGHT
jointures sont implicitement OUTER
jointures.J'espère que cela a aidé.
JOIN
les conditions doivent normalement être indépendantes des conditions du filtre. Vous définissez les règles de votre jointure (le comment) avec ON
. Vous filtrez quoi vous voulez avec WHERE
. En termes de performances, il n'y a pas de règle générale pour tous les moteurs et tous les modèles, votre kilométrage variera donc considérablement.
Je pense que le moyen le plus rapide est de placer le filtre dans la clause where, car il procédera d'abord à ce filtre dans la clause where, puis la clause join, il n'y aura donc pas besoin de permutation de filtres.