Maison >base de données >tutoriel mysql >L'utilisation de « OR » dans les conditions INNER JOIN est-elle toujours mauvaise pour les performances SQL ?
SQL INNER JOIN
avec OR
: Goulot d'étranglement des performances
Un récent effort d'optimisation des performances a mis en évidence un problème important : l'utilisation de l'opérateur OR
dans une condition INNER JOIN
. La requête suivante illustre le problème :
<code class="language-sql">SELECT mt.ID, mt.ParentID, ot.MasterID FROM dbo.MainTable AS mt INNER JOIN dbo.OtherTable AS ot ON ot.ParentID = mt.ID OR ot.ID = mt.ParentID</code>
Cette requête s'est avérée lente. Réécrivez-le en utilisant LEFT JOIN
les performances considérablement améliorées :
<code class="language-sql">SELECT mt.ID, mt.ParentID, CASE WHEN ot1.MasterID IS NOT NULL THEN ot1.MasterID ELSE ot2.MasterID END AS MasterID FROM dbo.MainTable AS mt LEFT JOIN dbo.OtherTable AS ot1 ON ot1.ParentID = mt.ID LEFT JOIN dbo.OtherTable AS ot2 ON ot2.ID = mt.ParentID WHERE ot1.MasterID IS NOT NULL OR ot2.MasterID IS NOT NULL</code>
La requête révisée exécutée en quelques secondes, une amélioration substantielle. Cela soulève des inquiétudes quant à l'utilisation générale de OR
dans des conditions JOIN
.
Pourquoi OR
dans les JOINs peut être lent
Le problème principal est que OR
dans des conditions JOIN
empêche l'optimiseur SQL Server d'utiliser des jointures HASH
ou MERGE
efficaces. Ces méthodes de jointure optimisées sont généralement cruciales pour une exécution rapide des requêtes. La condition OR
empêche le serveur de reconnaître l'équivalence de la requête à deux équijointures distinctes :
<code class="language-sql">SELECT * FROM maintable m JOIN othertable o ON o.parentId = m.id UNION SELECT * FROM maintable m JOIN othertable o ON o.id = m.parentId</code>
Cela oblige SQL Server à choisir un plan d'exécution moins efficace, ce qui entraîne des performances plus lentes.
Bonnes pratiques : éviter OR
dans JOIN
Conditions
Bien que cela ne soit pas strictement interdit, l'utilisation de OR
dans des conditions JOIN
entrave souvent l'optimisation et entraîne une dégradation des performances. Pour plusieurs conditions de jointure, des équijointures séparées (comme indiqué ci-dessus avec l'instruction LEFT JOIN
et UNION
ou LEFT JOIN
avec CASE
) offrent généralement des performances supérieures. Cela permet à l'optimiseur de requêtes d'exploiter ses algorithmes les plus efficaces.
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!