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