Optimisation SQL INNER JOIN
Requêtes contenant des conditions « OU » : une analyse des performances
Un récent goulot d'étranglement des performances dans une requête SQL Server 2008 provenait d'une condition OR
dans un INNER JOIN
. La requête originale, impliquant deux tables (chacune avec seulement 50 000 lignes), présentait des ralentissements importants.
La requête inefficace utilisait la JOIN
condition 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>
Ceci a été refactorisé à l'aide d'une paire de LEFT JOIN
, ce qui a entraîné une amélioration spectaculaire des performances (de plusieurs minutes à environ une seconde) :
<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>
Cela soulève la question : faut-il éviter les OR
conditions contenues dans les JOIN
clauses ? Bien que cela ne soit pas universellement préjudiciable, il est crucial de comprendre leurs implications en termes de performances.
Le principal problème réside dans les limites de l'optimiseur. Un JOIN
avec une condition OR
ne peut pas exploiter les méthodes de jointure optimisées telles que HASH JOIN ou MERGE JOIN. La logique de la requête est essentiellement équivalente à deux jointures distinctes combinées à l'aide de UNION
:
<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>
Cependant, l'optimiseur SQL Server peut ne pas reconnaître cette équivalence, ce qui conduit à un plan d'exécution moins efficace, en particulier avec des ensembles de données plus volumineux. L'approche LEFT JOIN
, en revanche, permet à l'optimiseur d'employer des stratégies plus efficaces. Par conséquent, bien que cela ne soit pas toujours problématique, les conditions OR
dans les JOIN
doivent être soigneusement examinées et potentiellement refactorisées pour des performances optimales.
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!