Datenbankoptimierung: Leistungsauswirkungen von OR-Bedingungen in INNER JOIN
Bei der Optimierung von Datenbankabfragen ist es wichtig, die Auswirkungen verschiedener Bedingungen in der JOIN-Anweisung zu verstehen. Eines der häufigsten Probleme ist die Verwendung von OR-Bedingungen in INNER JOIN.
Bedenken Sie die folgende Abfrage:
<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>
Die Ausführung dieser Abfrage dauert zunächst einige Minuten. Nach näherer Betrachtung wurde festgestellt, dass das Problem die ODER-Bedingung im INNER JOIN war.
Um dieses Problem zu lösen, wurde die Abfrage umgeschrieben, um ein Paar LEFT JOINs zu verwenden:
<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 optimierte Abfrage wird nun in etwa einer Sekunde ausgeführt.
Die Verwendung von OR-Bedingungen in INNER JOIN beeinträchtigt die Abfrageleistung aus folgenden Gründen erheblich:
Daher ist es besser, solche Bedingungen mithilfe verketteter Ergebnismengen auszudrücken. Im obigen Beispiel würde dies wie folgt lauten:
<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>
Durch die Verwendung von Equijoins und die Verkettung der Ergebnisse kann der Abfrageoptimierer Vorgänge effizient ausführen, ohne dass es zu Leistungseinbußen kommt. Beachten Sie hier die Verwendung von UNION ALL
. Verwenden Sie UNION
, wenn Sie doppelte Zeilen entfernen müssen.
Das obige ist der detaillierte Inhalt vonWarum führt eine OR-Bedingung in einem INNER JOIN zu Leistungseinbußen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!