Betrachten Sie diese Abfragen ( SQL Fiddle ):
Abfrage 1:
SELECT * INTO #TMP1 FROM Foo
UNION
SELECT * FROM Boo
UNION
SELECT * FROM Koo;
Abfrage 2:
SELECT * INTO #TMP2 FROM Foo
UNION
SELECT * FROM Boo
UNION ALL
SELECT * FROM Koo;
Beachten Sie, dass sich Koo nicht mit Boo / Foo überschneidet, sodass das Endergebnis dasselbe ist. Die Frage ist, warum die erste UNION / UNION- Kombination nicht zu einer einzigen SORT-Operation zusammengeführt wird.
MERGE
join ist optimierter alsSORT
. Es hat eine lineare Komplexität und erfordert keine Speicherzuweisung.Antworten:
Das Abfrageoptimierungsprogramm verfügt über n-ary-Operatoren, obwohl die Ausführungsengine eher weniger hat. Zur Veranschaulichung werde ich eine vereinfachte Version Ihrer Tabellen verwenden - (SQL Fiddle) .
Schauen wir uns angesichts dieser Tabellen und Daten den Eingabebaum für eine Drei-Wege-
UNION
Abfrage an:Der logische Vereinigungsoperator hat einen Ausgang und drei untergeordnete Eingänge. Nach der kostenbasierten Optimierung ist der ausgewählte physische Baum eine Zusammenführungsverbindung mit drei Eingaben:
Die Ausgabe des Optimierers wird in eine Form überarbeitet, die die Ausführungs-Engine (ohne n-ary Merge Union) verarbeiten kann:
Durch das Umschreiben nach der Optimierung wird das N-Ary
PhyOp_MergeUnion
in mehrere Merge Union-Operatoren aufgeteilt. Beachten Sie, dass alle geschätzten Kosten mit dem "ursprünglichen" Gewerkschaftsbetreiber verbunden bleiben - die anderen haben eine Kostenschätzung von Null.Die Gründe des Optimierers für Gewerkschaften, die n-ary-Operatoren verwenden, liefern eine Erklärung dafür, warum es nicht in Betracht gezogen wird, Ihr erstes Beispiel in denselben Plan wie das zweite Beispiel umzuschreiben (die Drei-Wege-Vereinigung ist ein einzelner Baumknoten).
Der zweite Grund ist, dass es keine Einschränkungen gibt, um die „fehlende Überlappung“ durchzusetzen. Bevor Einschränkungen bestehen, kann eine Vereinigung zwischen
boo
und eskoo
kann nicht garantiert werden, dass keine Duplikate erzeugt werden. Daher erhalten wir einen Plan zum Entfernen von Duplikaten (in diesem Fall eine Zusammenführungsunion):Durch Hinzufügen der folgenden Einschränkungen wird sichergestellt, dass die Nichtüberlappungsbedingung nicht verletzt werden kann, ohne die zwischengespeicherten Pläne für die Abfrage ungültig zu machen:
Jetzt kann der Optimierer sicher einfach verketten:
Selbst mit diesen Einschränkungen wird die Drei-Wege-Vereinigungsabfrage immer noch als drei Vereinigungen angezeigt, da der Optimierer normalerweise nicht in Betracht zieht, n-ary-Operatoren aufzuteilen, um Alternativen zu untersuchen. Der n-ary-Operator ist sehr nützlich, um den Suchraum unter Kontrolle zu halten. Ein Auseinanderbrechen wäre oft kontraproduktiv, da der Optimierer das Ziel hat, schnell einen guten Plan zu finden.
Wenn als
UNION
und geschriebenUNION ALL
, kann ein n-ary-Operator nicht mehr verwendet werden (die Typen stimmen nicht überein), sodass der Baum separate Knoten hat:quelle
SQL Server verfügt über 3-Wege-Set-Operationen. Der Operator CONCATENATION akzeptiert n Eingaben. Gegeben zum Beispiel zehn Tabellen:
und eine Abfrage, die alles vereint, um eine Zeile in jeder Tabelle mit demselben Schlüssel zu finden:
Es wird ein Abfrageplan angezeigt, bei dem die Zeilen übereinstimmen (mit dem Prädikat Pushdown im Operator TABLE SCAN) und dann alle Ergebnisse in den
SELECT
Operator verkettet werden.Der Grund dafür, dass Sie keinen Plan zusammenführen und dann sortieren, ist, dass er sehr langsam ist und die Sortierung nicht erforderlich ist, um den
UNION
Vorgang zu implementieren . In Ihren BOO-, FOO- und KOO-Tabellen haben Sie einen Primärschlüssel deklariert. Wenn der CLUSTERED INDEX SCAN-Accessor die Zeilen auflistet, werden sie garantiert in der Reihenfolge des zugrunde liegenden Clustered-Index erstellt. Das Verketten von zwei Sätzen und das Sortieren des Ergebnisses ist viel langsamer als die Verwendung des Operators MERGE JOIN, und der Operator MJ kann sehr einfach verwendet werden, da beide Sätze sortiert und indiziert sind.quelle