Maison >base de données >tutoriel mysql >Pourquoi une condition OR dans une INNER JOIN entraîne-t-elle une pénalité de performance ?

Pourquoi une condition OR dans une INNER JOIN entraîne-t-elle une pénalité de performance ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-10 18:47:43969parcourir

Why Does an OR Condition in an INNER JOIN Cause a Performance Penalty?

Optimisation de la base de données : impact sur les performances des conditions OR dans INNER JOIN

Dans l'optimisation des requêtes de base de données, il est crucial de comprendre l'impact des différentes conditions dans l'instruction JOIN. L’un des problèmes courants concerne l’utilisation des conditions OR dans INNER JOIN.

Considérez la requête suivante :

<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 prendra plusieurs minutes à s'exécuter initialement. Après une inspection plus approfondie, il a été déterminé que le problème était la condition OR dans INNER JOIN.

Pour résoudre ce problème, la requête a été réécrite pour utiliser une paire de LEFT JOIN :

<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 optimisée termine désormais son exécution en environ une seconde.

L'utilisation de conditions OR dans INNER JOIN affectera sérieusement les performances des requêtes pour les raisons suivantes :

  • Cela empêche l'optimiseur d'utiliser des algorithmes de jointure plus efficaces tels que HASH JOIN ou MERGE JOIN.
  • Cela oblige l'optimiseur à générer un produit cartésien, ce qui est coûteux en calcul pour les grandes tables.

Par conséquent, il est préférable d'exprimer de telles conditions en utilisant des ensembles de résultats concaténés. Dans l'exemple ci-dessus, cela se traduirait par :

<code class="language-sql">SELECT  *
FROM    maintable m
JOIN    othertable o
ON      o.parentId = m.id
UNION ALL
SELECT  *
FROM    maintable m
JOIN    othertable o
ON      o.id = m.parentId</code>

En utilisant des équijointures et en concaténant les résultats, l'optimiseur de requêtes peut effectuer des opérations efficacement sans encourir de pénalité de performances. Notez l'utilisation de UNION ALL ici, utilisez UNION si vous devez supprimer les lignes en double.

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