Heim > Datenbank > MySQL-Tutorial > Warum sind „OR'-Bedingungen in INNER JOINs so langsam?

Warum sind „OR'-Bedingungen in INNER JOINs so langsam?

Mary-Kate Olsen
Freigeben: 2025-01-10 19:07:42
Original
607 Leute haben es durchsucht

Why Are

Analyse von Leistungsproblemen, die durch die Verwendung von „OR“ unter INNER JOIN-Bedingungen in SQL Server 2008 verursacht werden

Eine langsame Abfrage von zwei kleinen Tabellen mit etwa 50.000 Zeilen und eine sorgfältige Prüfung durch einen SQL Server 2008-Datenbankexperten ergaben den Übeltäter: den „OR“-Operator in der INNER JOIN-Bedingung.

Der problematische Codeausschnitt lautet wie folgt:

<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

Nach dem Ersetzen von „OR“ durch ein Paar LEFT JOIN wird die Abfragegeschwindigkeit erheblich verbessert und kann in nur einer Sekunde abgeschlossen werden.

Ist „OR“ in der JOIN-Bedingung eine schlechte Praxis?

Experten fragen sich, ob die Verwendung von „OR“ in einer JOIN-Bedingung immer unerwünscht ist oder ob ihr Fall aufgrund der spezifischen Tabellenstruktur nur eine Ausnahme darstellt.

Technische Erklärung

Das Problem bei der Verwendung von „OR“ in einer JOIN-Bedingung besteht darin, dass sie nicht in eine HASH JOIN- oder MERGE JOIN-Operation optimiert werden kann. Der Abfrageoptimierer kann dies nur als Zusammenführung verschiedener Ergebnismengen darstellen:

<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

Obwohl jede einzelne Ergebnismenge ein Equijoin ist, erkennt der Optimierer sie nicht als Equijoin, wenn „OR“ vorhanden ist. Dies führt zu ineffizienten Abfragen.

Das obige ist der detaillierte Inhalt vonWarum sind „OR'-Bedingungen in INNER JOINs so langsam?. 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