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