SQL INNER JOIN
mit OR
: Leistungsengpass
Bei einem kürzlich durchgeführten Versuch zur Leistungsoptimierung wurde ein erhebliches Problem hervorgehoben: die Verwendung des OR
-Operators innerhalb einer INNER JOIN
-Bedingung. Die folgende Abfrage veranschaulicht das Problem:
<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>
Diese Abfrage erwies sich als langsam. Umschreiben mit LEFT JOIN
s dramatisch verbesserter Leistung:
<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>
Die überarbeitete Abfrage wurde in Sekundenschnelle ausgeführt, eine wesentliche Verbesserung. Dies wirft Bedenken hinsichtlich der allgemeinen Verwendung von OR
in JOIN
-Bedingungen auf.
Warum OR
in JOINs langsam sein können
Das Kernproblem besteht darin, dass OR
unter JOIN
-Bedingungen verhindert, dass der SQL Server-Optimierer effiziente HASH
- oder MERGE
-Joins verwendet. Diese optimierten Join-Methoden sind in der Regel für eine schnelle Abfrageausführung von entscheidender Bedeutung. Die OR
-Bedingung verhindert, dass der Server die Äquivalenz der Abfrage zu zwei separaten Equijoins erkennt:
<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>
Dies zwingt SQL Server dazu, einen weniger effizienten Ausführungsplan zu wählen, was zu einer langsameren Leistung führt.
Best Practices: Vermeiden Sie OR
unter JOIN
Bedingungen
Die Verwendung von OR
unter JOIN
-Bedingungen ist zwar nicht streng verboten, behindert jedoch häufig die Optimierung und führt zu Leistungseinbußen. Bei mehreren Join-Bedingungen bieten separate Equijoins (wie oben mit der Anweisung LEFT JOIN
und UNION
oder LEFT JOIN
mit CASE
gezeigt) im Allgemeinen eine bessere Leistung. Dadurch kann der Abfrageoptimierer seine effizientesten Algorithmen nutzen.
Das obige ist der detaillierte Inhalt vonIst die Verwendung von „OR' in INNER JOIN-Bedingungen immer schlecht für die SQL-Leistung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!