Ich habe gemischte Informationen dazu gehört und hoffe auf eine kanonische oder Expertenmeinung.
Wenn ich mehrere LEFT OUTER JOIN
s habe, die jeweils vom letzten abhängen, ist es besser, sie zu verschachteln?
Für ein erfundenes Beispiel hängt das JOIN
to MyParent
vom JOIN
to ab MyChild
:
http://sqlfiddle.com/#!3/31022/5
SELECT
{columns}
FROM
MyGrandChild AS gc
LEFT OUTER JOIN
MyChild AS c
ON c.[Id] = gc.[ParentId]
LEFT OUTER JOIN
MyParent AS p
ON p.[id] = c.[ParentId]
Im Vergleich zu http://sqlfiddle.com/#!3/31022/7
SELECT
{columns}
FROM
MyGrandChild AS gc
LEFT OUTER JOIN
(
MyChild AS c
LEFT OUTER JOIN
MyParent AS p
ON p.[id] = c.[ParentId]
)
ON c.[Id] = gc.[ParentId]
Wie oben gezeigt, erzeugen diese unterschiedliche Abfragepläne in SS2k8
sql-server-2008-r2
performance
join
Matthew
quelle
quelle
JOIN
einINNER JOIN
ON ... ON
zweimal in Folge (Klammer oder nicht) ist sehr verwirrend.use plan
Hinweis funktioniert, wenn der zweite Abfrageplan in den ersten übertragen wird, nicht jedoch umgekehrt.Antworten:
Dies ist absolut keine kanonische Antwort, aber ich habe festgestellt, dass es für die in der SQL-Geige gezeigten Abfragepläne für verschachtelte Schleifen möglich war, den Plan unter Verwendung des
USE PLAN
Hinweises von Abfrage 2 auf Abfrage 1 anzuwenden, aber der Versuch der umgekehrten Operation schlägt fehlDurch Deaktivieren der Optimierungsumwandlungsregel wird
ReorderLOJN
verhindert, dass der zuvor erfolgreiche Planhinweis ebenfalls erfolgreich ist.Das Experimentieren mit größeren Datenmengen zeigt, dass SQL Server sicherlich auch
(A LOJ B) LOJ C
aufA LOJ (B LOJ C)
natürliche Weise transformiert werden kann , aber ich habe keine Beweise dafür gesehen, dass das Gegenteil der Fall ist.Ein sehr ausgeklügelter Fall, in dem die erste Abfrage eine bessere Leistung erbringt als die zweite
Welches gibt Pläne
Für mich hatte Abfrage 1 eine verstrichene Zeit von 108 ms gegenüber 1.163 ms für Abfrage 2.
Abfrage 1
Abfrage 2
Es kann daher vorläufig davon ausgegangen werden, dass die erste ("nicht verschachtelte") Syntax potenziell vorteilhaft ist, da dadurch mehr potenzielle Verknüpfungsaufträge berücksichtigt werden können, aber ich habe nicht ausführlich genug getestet, um in der Regel viel Vertrauen in diese zu haben.
Es ist durchaus möglich, Gegenbeispiele zu erstellen, bei denen Abfrage 2 eine bessere Leistung erbringt. Probieren Sie beide aus und sehen Sie sich die Ausführungspläne an.
quelle
Es gibt keinen solchen JOIN-Typ namens "Nested Join". Es handelt sich um eine andere Variante des Schreibens, bei der JOIN aus Gründen der Lesbarkeit verwendet werden kann. Sie können sie nur zum Verständnis als "Unterabfragen" anzeigen.
Wenn Sie sich mehr Gedanken über die Lesbarkeit von Code machen, ist es meine Wahl, mit welcher Person sie sich beraten lassen.
Wenn Sie Bedenken hinsichtlich der Leistung der Abfrage haben und der Hinweis "JOIN ORDER erzwingen" in der Abfrage nicht verwendet wird, spielt es keine Rolle, ob die Abfrage mit "Nested Join" oder All "Outer Join" geschrieben wurde. SQL Server erstellt die Reihenfolge basierend auf den Kosten für die Verknüpfung von zwei Tabellen und / oder dem Ergebnis. SQL Server führt die Verbindung zwischen zwei Datensätzen gleichzeitig durch.
Stellen Sie sich in der Tat vor, dass auf die zweite Weise "verschachtelter Join", wenn SQL Server sich für den zweiten Teil entscheidet, "MyChild AS c LEFT OUTER JOIN MyParent AS p ON p. [id] = c. [ParentId]" und diese Tabelle auftreten Zeilen zu haben, die in NEXT LEFT JOIN verworfen werden. In diesem Fall hat SQL Server unnötige Ressourcen aufgewendet, um OUTER JOIN für diese beiden auszuführen und das Ergebnis an next JOIN zu übergeben.
Sie können hier auch ähnlich gestellte und beantwortete ähnliche Fragen sehen. Grundlegendes zur Syntax "Verschachtelter Join"
quelle
FORCE JOIN ORDER
Hinweis zu verwenden?