Maison >base de données >tutoriel mysql >Clause WHERE ou ON dans les requêtes JOIN : quand dois-je utiliser laquelle pour des performances optimales ?

Clause WHERE ou ON dans les requêtes JOIN : quand dois-je utiliser laquelle pour des performances optimales ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-04 09:58:35140parcourir

WHERE vs. ON Clause in JOIN Queries: When Should I Use Which for Optimal Performance?

Clause WHERE vs ON dans la requête JOIN : implications en termes de performances

Lors de l'utilisation de requêtes JOIN dans T-SQL, il est courant de rencontrer le choix entre placer les conditions de filtrage dans la clause WHERE ou la clause ON. Bien que les deux approches puissent produire le même ensemble de résultats, il existe de subtiles différences de performances à prendre en compte.

Plus précisément, examinons la requête suivante :

SELECT *
FROM Foo f
INNER JOIN Bar b ON (b.BarId = f.BarId);
WHERE b.IsApproved = 1;

Par rapport à :

SELECT *
FROM Foo f
INNER JOIN Bar b ON (b.IsApproved = 1) AND (b.BarId = f.BarId);

Les deux requêtes renvoient des ensembles de lignes identiques, mais les caractéristiques de performances diffèrent.

En général, placer des filtres dans la clause ON est préféré pour les raisons suivantes :

  • Optimise les opérations de jointure : La clause ON est évaluée avant que des lignes ne soient jointes, permettant à la base de données de joindre de manière sélective uniquement les lignes qui répondent aux critères spécifiés. Cela se traduit par un processus de jointure plus efficace.
  • Minimise la taille de l'ensemble de résultats : En filtrant dans la clause ON, vous réduisez le nombre de lignes soumises à l'évaluation de la clause WHERE, ce qui conduit à un ensemble de résultats potentiellement plus petit.

Cependant, il existe des cas où placer des filtres dans la clause WHERE est nécessaire :

  • Jointures externes : Les jointures externes incluent les lignes du tableau de gauche même s'il n'y a aucune ligne correspondante dans le tableau de droite. Placer des filtres dans la clause WHERE vous permet de filtrer l'ensemble de résultats une fois la jointure effectuée.
  • Filtrage OPTIONNEL : Les filtres OPTIONNELS permettent de renvoyer les lignes même si la condition de jointure n'est pas remplie. Par exemple, la requête suivante requiert que b.IsApproved soit NULL ou 1 :
SELECT *
FROM Foo f
LEFT OUTER JOIN Bar b ON (b.BarId = f.BarId)
WHERE (b.IsApproved IS NULL OR b.IsApproved = 1);

Conclusion :

Lorsque les performances sont un problème, envisagez de placer conditions de filtrage dans la clause ON pour optimiser les opérations de jointure et réduire la taille du jeu de résultats. Pour les jointures externes ou le filtrage OPTIONNEL, la clause WHERE doit être utilisée pour obtenir le filtrage souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn