SQL optimieren INNER JOIN
Abfragen mit „OR“-Bedingungen: Eine Leistungsanalyse
Ein kürzlich aufgetretener Leistungsengpass in einer SQL Server 2008-Abfrage war auf eine OR
-Bedingung innerhalb einer INNER JOIN
-Bedingung zurückzuführen. Die ursprüngliche Abfrage, die zwei Tabellen (jede mit nur 50.000 Zeilen) umfasste, zeigte erhebliche Verlangsamungen.
Die ineffiziente Abfrage verwendete die folgende JOIN
Bedingung:
<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>
Dies wurde mithilfe von zwei LEFT JOIN
s umgestaltet, was zu einer dramatischen Leistungsverbesserung führte (von mehreren Minuten auf etwa eine Sekunde):
<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>
Dies wirft die Frage auf: Sollten OR
Bedingungen innerhalb von JOIN
Klauseln vermieden werden? Auch wenn dies nicht allgemein schädlich ist, ist es von entscheidender Bedeutung, ihre Auswirkungen auf die Leistung zu verstehen.
Das Kernproblem liegt in den Einschränkungen des Optimierers. Ein JOIN
mit einer OR
-Bedingung kann keine optimierten Join-Methoden wie HASH JOIN oder MERGE JOIN nutzen. Die Logik der Abfrage entspricht im Wesentlichen zwei separaten Joins, die mit 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>
Der SQL Server-Optimierer erkennt diese Äquivalenz jedoch möglicherweise nicht, was zu einem weniger effizienten Ausführungsplan führt, insbesondere bei größeren Datensätzen. Der LEFT JOIN
-Ansatz hingegen ermöglicht es dem Optimierer, effizientere Strategien anzuwenden. Obwohl dies nicht immer problematisch ist, sollten OR
die Bedingungen in JOIN
s daher sorgfältig geprüft und möglicherweise umgestaltet werden, um eine optimale Leistung zu erzielen.
Das obige ist der detaillierte Inhalt vonWie kann ich SQL INNER JOIN-Abfragen mit „OR'-Bedingungen optimieren, um die Leistung zu verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!