Heim > Datenbank > MySQL-Tutorial > Warum führt eine OR-Bedingung in einem INNER JOIN zu Leistungseinbußen?

Warum führt eine OR-Bedingung in einem INNER JOIN zu Leistungseinbußen?

Mary-Kate Olsen
Freigeben: 2025-01-10 18:47:43
Original
965 Leute haben es durchsucht

Why Does an OR Condition in an INNER JOIN Cause a Performance Penalty?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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:

  • Es verhindert, dass der Optimierer effizientere Join-Algorithmen wie HASH JOIN oder MERGE JOIN verwendet.
  • Es zwingt den Optimierer, ein kartesisches Produkt zu generieren, was bei großen Tabellen rechenintensiv ist.

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage