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