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