Maison > base de données > tutoriel mysql > Pourquoi les conditions « OU » dans les INNER JOIN sont-elles si lentes ?

Pourquoi les conditions « OU » dans les INNER JOIN sont-elles si lentes ?

Mary-Kate Olsen
Libérer: 2025-01-10 19:07:42
original
606 Les gens l'ont consulté

Why Are

Analyse des problèmes de performances causés par l'utilisation de "OR" dans les conditions INNER JOIN dans SQL Server 2008

Une requête lente sur deux petites tables d'environ 50 000 lignes et une inspection minutieuse par un expert en base de données SQL Server 2008 ont révélé le coupable : l'opérateur "OR" dans la condition INNER JOIN.

L'extrait de code problématique est le suivant :

<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>
Copier après la connexion

Après avoir remplacé « OR » par une paire de LEFT JOIN, la vitesse de requête est considérablement améliorée et peut être complétée en une seconde seulement.

"OR" dans la condition JOIN est-il une mauvaise pratique ?

Les experts se demandent si l'utilisation de "OR" dans une condition JOIN est toujours indésirable, ou si leur cas n'est qu'une exception en raison de la structure spécifique de la table.

Explication technique

Le problème avec l'utilisation de "OR" dans une condition JOIN est qu'il ne peut pas être optimisé dans une opération HASH JOIN ou MERGE JOIN. L'optimiseur de requêtes ne peut représenter cela que comme une fusion de différents ensembles de résultats :

<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>
Copier après la connexion

Bien que chaque ensemble de résultats individuel soit une équijointure, l'optimiseur ne les reconnaît pas comme des équijointures lorsque « OU » est présent. Cela entraîne des requêtes inefficaces.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal