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
Libérer: 2025-01-10 19:01:41
original
696 Les gens l'ont consulté

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

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

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

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!

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