Filtrage des jointures uniquement à l'aide de WHERE
peut être extrêmement inefficace dans certains scénarios courants. Par exemple :
SELECT * FROM people p, companies c
WHERE p.companyID = c.id AND p.firstName = 'Daniel'
La plupart des bases de données exécuteront littéralement cette requête, en prenant d'abord le produit cartésien
des people
et companies
tableaux et puis filtrage par ceux qui ont companyID
correspondant et id
des champs. Bien que le produit entièrement sans contrainte n'existe nulle part ailleurs qu'en mémoire et seulement pendant un moment, son calcul prend un certain temps.
Une meilleure approche consiste à regrouper les contraintes avec le JOIN
s le cas échéant. Ce n'est pas seulement subjectivement plus facile à lire, mais aussi beaucoup plus efficace. Ainsi :
SELECT * FROM people p JOIN companies c ON p.companyID = c.id
WHERE p.firstName = 'Daniel'
C'est un peu plus long, mais la base de données est capable de regarder le ON
clause et l'utiliser pour calculer le JOIN
entièrement contraint directement, plutôt que de commencer par tout puis en limitant. Ceci est plus rapide à calculer (en particulier avec de grands ensembles de données et/ou des jointures à plusieurs tables) et nécessite moins de mémoire.
Je change chaque requête que je vois qui utilise la "virgule JOIN
" syntaxe. À mon avis, le seul but de son existence est la concision. Compte tenu de l'impact sur les performances, je ne pense pas que ce soit une raison impérieuse.