Maison >base de données >tutoriel mysql >L'utilisation de « OR » dans les conditions INNER JOIN est-elle toujours mauvaise pour les performances SQL ?

L'utilisation de « OR » dans les conditions INNER JOIN est-elle toujours mauvaise pour les performances SQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-10 19:01:41647parcourir

Is Using

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 JOINles 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!

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