UNIONEntfernt doppelte Datensätze (wobei alle Spalten in den Ergebnissen gleich sind), UNION ALLnicht.
Es gibt einen Leistungseinbruch bei der Verwendung von UNIONanstelle von UNION ALL, da der Datenbankserver zusätzliche Arbeit leisten muss, um die doppelten Zeilen zu entfernen, aber normalerweise möchten Sie die doppelten nicht (insbesondere beim Entwickeln von Berichten).
UNION Beispiel:
SELECT'foo'AS bar UNIONSELECT'foo'AS bar
Ergebnis:
+-----+| bar |+-----+| foo |+-----+1rowinset(0.00 sec)
UNION ALL Beispiel:
SELECT'foo'AS bar UNIONALLSELECT'foo'AS bar
Ergebnis:
+-----+| bar |+-----+| foo || foo |+-----+2rowsinset(0.00 sec)
Dies impliziert, dass die Vereinigung viel weniger leistungsfähig ist, da das Ergebnis nach Duplikaten
Matthew Watson,
19
UNION ALL wird in der Tat performanter sein, insbesondere aufgrund des Fehlens der eindeutigen Sorte. Meine allgemeine Praxis besteht darin, UNION ALL zu verwenden, es sei denn, ich möchte ausdrücklich Duplikate.
Adam Caviness
6
Ich habe gerade bemerkt, dass es hier viele gute Kommentare / Antworten gibt, also habe ich die Wiki-Flagge aktiviert und einen Hinweis zur Leistung hinzugefügt ...
Jim Harte
250
UNION ALL kann in realen Fällen, in denen das Netzwerk wie das Internet ein Engpass ist, langsamer sein als UNION. Die Kosten für die Übertragung vieler doppelter Zeilen können den Vorteil der Abfrageausführungszeit überschreiten. Dies muss von Fall zu Fall analysiert werden.
Charles Burns
23
@AdamCaviness Dein Kommentar macht keinen Sinn.
Kojow7
285
Sowohl UNION als auch UNION ALL verketten das Ergebnis von zwei verschiedenen SQLs. Sie unterscheiden sich in der Art und Weise, wie sie mit Duplikaten umgehen.
UNION führt eine DISTINCT für die Ergebnismenge durch, wodurch doppelte Zeilen entfernt werden.
UNION ALL entfernt keine Duplikate und ist daher schneller als UNION.
Hinweis: Bei Verwendung dieser Befehle müssen alle ausgewählten Spalten vom gleichen Datentyp sein.
Beispiel: Wenn wir zwei Tabellen haben, 1) Mitarbeiter und 2) Kunde
Daten der Mitarbeitertabelle:
Kundentabellendaten:
UNION-Beispiel (Alle doppelten Datensätze werden entfernt):
UNION ALL Beispiel (Es werden nur Datensätze verkettet, keine Duplikate entfernt, es ist also schneller als UNION):
"Alle ausgewählten Spalten müssen vom gleichen Datentyp sein" - tatsächlich sind die Dinge nicht so streng (aus Sicht eines relationalen Modells keine gute Sache!). Der SQL-Standard besagt, dass der jeweilige Spaltendeskriptor bis auf den Namen identisch sein muss.
Tag, wenn
47
UNIONEntfernt Duplikate, UNION ALLnicht jedoch.
Um Duplikate zu entfernen, muss die Ergebnismenge sortiert werden. Dies kann sich je nach dem zu sortierenden Datenvolumen und den Einstellungen verschiedener RDBMS-Parameter (für Oracle PGA_AGGREGATE_TARGETmit WORKAREA_SIZE_POLICY=AUTOoder SORT_AREA_SIZEund) auf die Leistung der UNION auswirkenSOR_AREA_RETAINED_SIZE wenn WORKAREA_SIZE_POLICY=MANUAL) .
Grundsätzlich ist die Sortierung schneller, wenn sie im Speicher ausgeführt werden kann, es gilt jedoch die gleiche Einschränkung hinsichtlich des Datenvolumens.
Wenn Sie Daten benötigen, die ohne Duplikate zurückgegeben werden, müssen Sie dies natürlich tun UNION verwenden, abhängig von der Quelle Ihrer Daten.
Ich hätte den ersten Beitrag kommentiert, um den Kommentar "ist viel weniger performant" zu qualifizieren, habe aber nicht genügend Ruf (Punkte), um dies zu tun.
"Um Duplikate zu entfernen, muss die Ergebnismenge sortiert werden" - vielleicht haben Sie einen bestimmten Anbieter im Sinn, aber die Frage enthält keine herstellerspezifischen Tags. Könnten Sie auch dann nachweisen, dass Duplikate nicht ohne Sortierung entfernt werden können?
Tag, wenn
2
different sortiert die Ergebnisse "implizit", da das Entfernen von Duplikaten in einem sortierten Satz schneller ist. Dies bedeutet nicht, dass die zurückgegebene Ergebnismenge tatsächlich auf diese Weise sortiert ist, aber in den meisten Fällen wird die Ergebnismenge intern durch eindeutige (und daher UNION) sortiert.
DevilSuichiro
30
In ORACLE: UNION werden BLOB- (oder CLOB-) Spaltentypen nicht unterstützt, UNION ALL jedoch.
Der grundlegende Unterschied zwischen UNION und UNION ALL besteht darin, dass durch die Union-Operation die doppelten Zeilen aus der Ergebnismenge entfernt werden. Union all gibt jedoch alle Zeilen nach dem Beitritt zurück.
Sie können Duplikate vermeiden und trotzdem viel schneller als UNION DISTINCT (das eigentlich mit UNION identisch ist) ausführen, indem Sie die folgende Abfrage ausführen:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
Beachten Sie das AND a!=XTeil. Das ist viel schneller als UNION.
Dies lässt Zeilen aus und führt daher nicht zum erwarteten Ergebnis, wenn a NULL-Werte enthält. Außerdem ist es immer noch nicht das gleiche Ergebnis wie eine Rückkehr UNION- UNIONauch Duplikate entfernt , die durch die Unterabfragen zurückgegeben werden, während Ihr Ansatz nicht.
Frank Schmitt
@FrankSchmitt - danke für diese Antwort; Dieses bisschen über Unterabfragen ist genau das, was ich wissen wollte!
Doradus
11
Um meine zwei Cent zur Diskussion hier hinzuzufügen: Man könnte den UNIONOperator als reine, SET-orientierte UNION verstehen - zB set A = {2,4,6,8}, set B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}
Wenn Sie mit Mengen arbeiten, möchten Sie nicht, dass die Zahlen 2 und 4 zweimal erscheinen, da sich ein Element entweder in einer Menge befindet oder nicht .
In der SQL-Welt möchten Sie möglicherweise alle Elemente aus den beiden Sätzen zusammen in einer "Tasche" anzeigen {2,4,6,8,1,2,3,4}. Und zu diesem Zweck bietet T-SQL dem Bediener UNION ALL.
Nitpick: UNION ALLwird von T-SQL nicht "angeboten". UNION ALList Teil des ANSI SQL-Standards und nicht spezifisch für MS SQL Server.
Frank Schmitt
1
Der 'Nitpick'-Kommentar könnte bedeuten, dass Sie "Union All" in TSQL nicht verwenden können, aber Sie können. Natürlich sagt der Kommentar das nicht , aber jemand, der ihn liest, kann darauf schließen.
Joseph
10
UNION
Der UNIONBefehl wird verwendet, um verwandte Informationen aus zwei Tabellen auszuwählen, ähnlich wie der JOINBefehl. Bei Verwendung des UNIONBefehls müssen jedoch alle ausgewählten Spalten vom gleichen Datentyp sein. MitUNION werden nur unterschiedliche Werte ausgewählt.
UNION ALL
Der UNION ALLBefehl entspricht dem UNIONBefehl, außer dassUNION ALL alle Werte ausgewählt werden.
Der Unterschied zwischen Unionund Union allbesteht darin, dass Union allkeine doppelten Zeilen entfernt werden. Stattdessen werden nur alle Zeilen aus allen Tabellen abgerufen, die Ihren Abfragespezifikationen entsprechen, und sie werden zu einer Tabelle kombiniert.
Eine UNIONAnweisung wirkt sich effektiv SELECT DISTINCTauf die Ergebnismenge aus. Wenn Sie wissen, dass alle zurückgegebenen Datensätze von Ihrer Gewerkschaft eindeutig sind, verwenden Sie UNION ALLstattdessen, um schnellere Ergebnisse zu erzielen.
Nicht sicher, ob es darauf ankommt, welche Datenbank
UNION und UNION ALL sollte auf allen SQL Servern funktionieren.
Sie sollten unnötige UNIONs vermeiden, da diese ein großes Leistungsleck darstellen. Als Faustregel verwenden, UNION ALLwenn Sie nicht sicher sind, welche Sie verwenden sollen.
Zu dieser Frage gibt es kein SQL Server-Tag. Ich denke, die Option, die Duplikate zurückgibt, nur weil sie normalerweise am besten funktioniert, ist der falsche Rat.
Tag, wenn
1
@onedaywhen ich denke, das OP hat den Ausdruck "SQL Server" als Synonym für alle RDBMS verwendet (z. B. MySQL, PostGreSQL, Oracle, SQL Server). Der Wortlaut ist jedoch unglücklich (und natürlich könnte ich mich irren).
Frank Schmitt
@FrankSchmitt: keines der Produkte Sie aufgelistet sind wirklich RDBMS :)
onedaywhen
1
@onedayWann möchten Sie näher darauf eingehen? Zumindest en.wikipedia.org/wiki/Relational_database_management_system scheint mir zuzustimmen - es werden ausdrücklich Microsoft SQL Server, Oracle Database und MySQL erwähnt. Oder sind Sie über den Unterschied zwischen Oracle und Oracle Database z.
Frank Schmitt
8
UNION - führt zu unterschiedlichen Datensätzen,
während
UNION ALL - zu allen Datensätzen einschließlich Duplikaten führt.
Beide sind blockierende Operatoren und daher bevorzuge ich persönlich die Verwendung von JOINS gegenüber blockierenden Operatoren (UNION, INTERSECT, UNION ALL usw.) jederzeit.
Um zu veranschaulichen, warum der Betrieb der Union im Vergleich zum Auschecken der Union All eine schlechte Leistung erbringt, sehen Sie sich das folgende Beispiel an.
Es folgen die Ergebnisse der Operationen UNION ALL und UNION.
Eine UNION-Anweisung führt effektiv ein SELECT DISTINCT für die Ergebnismenge durch. Wenn Sie wissen, dass alle zurückgegebenen Datensätze von Ihrer Gewerkschaft eindeutig sind, verwenden Sie stattdessen UNION ALL, um schnellere Ergebnisse zu erzielen.
Die Verwendung von UNION führt zu eindeutigen Sortiervorgängen im Ausführungsplan. Der Beweis, um diese Aussage zu beweisen, ist unten gezeigt:
Alles in dieser Antwort wurde bereits gesagt, ist zu verwirrend, um nützlich zu sein (Vorschläge für Gewerkschaften, wenn sie verschiedene Dinge tun, "Blockieren" als Grund angeben, ohne zu erklären, was Sie damit meinen oder auf welche Datenbankserver es sich bezieht) oder ist sehr irreführend (Ihre Prozentsätze in Ihrem Screenshot gelten nicht für die tatsächliche Verwendung von UNION/ UNION ALL).
Blockierungsoperatoren sind bekannte Operatoren in TSQL. Alles, was blockierende Operatoren tun, kann durch Joins erreicht werden, aber nicht umgekehrt. Die eindeutige Sortieroperation ist im Bild eingekreist, um zu zeigen, warum Union alle besser als Union funktioniert, und um genau zu zeigen, wo sie im Ausführungsplan vorhanden ist. Fühlen Sie sich frei, den Daten T1 und T2 weitere Daten hinzuzufügen, um mit den Prozentsätzen herumzuspielen!
DBA
Sie KÖNNEN technisch die Ergebnisse einer unionVerwendung einer Kombination aus joins und einigen wirklich bösen cases erzeugen , aber es macht es nahezu unmöglich, die Abfrage zu lesen und zu pflegen, und meiner Erfahrung nach ist sie auch für die Leistung schrecklich. Vergleichen Sie: select foo.bar from foo union select fizz.buzz from fizzgegenselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
Devin Lamothe
@DBA Ihre Antwort ist nur für Benutzer von MS SQL Server relevant. Das OP erwähnte nie das RDBMS, das sie verwenden - sie verwenden möglicherweise MySQL, PostgreSQL, Oracle, SQLite, ...
Frank Schmitt
6
Mit union werden unterschiedliche Werte aus zwei Tabellen ausgewählt, wobei mit union all alle Werte einschließlich Duplikate aus den Tabellen ausgewählt werden
Ihr zweites Bild deutet darauf hin, dass sich die beiden gegenseitig ausschließen, wenn dies nicht der Fall ist. Das Bild sollte eher das gleiche wie das erste zeigen, aber die 'Schnittpunktellipse' ()wird ein zweites Mal gezeigt. Da das union allErgebnis keine Menge ist, sollten Sie eigentlich nicht versuchen, es mit einem Venn-Diagramm zu zeichnen!
Tag, wenn
5
(Aus Microsoft SQL Server Book Online)
UNION [ALL]
Gibt an, dass mehrere Ergebnismengen kombiniert und als einzelne Ergebnismenge zurückgegeben werden sollen.
ALLE
Integriert alle Zeilen in die Ergebnisse. Dies schließt Duplikate ein. Wenn nicht angegeben, werden doppelte Zeilen entfernt.
UNIONDies dauert zu lange, da DISTINCTauf die Ergebnisse doppelte Zeilen angewendet werden.
Ein Nebeneffekt beim Anwenden DISTINCTauf Ergebnisse ist eine Sortieroperation für Ergebnisse.
UNION ALLDie Ergebnisse werden in beliebiger Reihenfolge für die Ergebnisse UNIONangezeigt. Die Ergebnisse werden jedoch so angezeigt, wie ORDER BY 1, 2, 3, ..., n (n = column number of Tables)sie auf die Ergebnisse angewendet werden. Sie können diesen Nebeneffekt sehen, wenn Sie keine doppelte Zeile haben.
UNION wird mit eindeutig -> langsamer zusammengeführt, da ein Vergleich erforderlich ist (Wählen Sie in Oracle SQL Developer die Abfrage aus und drücken Sie F10, um die Kostenanalyse anzuzeigen).
UNION ALL , es verschmilzt ohne Unterschied -> schneller.
UNION führt den Inhalt zweier strukturkompatibler Tabellen zu einer einzigen kombinierten Tabelle zusammen.
Unterschied:
Der Unterschied zwischen UNIONund UNION ALLbesteht darin, dass UNION willdoppelte Datensätze weggelassen UNION ALLwerden, während doppelte Datensätze enthalten sind.
UnionDie Ergebnismenge ist in aufsteigender Reihenfolge sortiert, während die UNION ALLErgebnismenge nicht sortiert ist
UNIONführt eine DISTINCTErgebnismenge durch, um doppelte Zeilen zu entfernen. Während UNION ALLnicht Duplikate entfernen und daher ist es schneller als UNION. *
Hinweis : Die Leistung von ist UNION ALLin der Regel besser als UNION, da UNIONder Server die zusätzliche Arbeit zum Entfernen von Duplikaten ausführen muss. In Fällen, in denen sicher ist, dass keine Duplikate vorhanden sind oder in denen Duplikate kein Problem darstellen, wird die Verwendung von UNION ALLaus Leistungsgründen empfohlen.
"Union Result Set ist in aufsteigender Reihenfolge sortiert" - Sofern keine vorhanden ist ORDER BY, werden sortierte Ergebnisse nicht garantiert. Vielleicht haben Sie einen bestimmten SQL-Anbieter im Sinn (selbst dann in aufsteigender Reihenfolge, was genau ...?), Aber diese Frage hat keine herstellerspezifischen Tags.
Tag, wenn
"führt den Inhalt von zwei strukturell kompatiblen Tabellen zusammen" - ich denke, Sie haben diesen Teil wirklich gut angegeben :)
am
2
Angenommen, Sie haben zwei Tischlehrer und -schüler
Beide haben 4 Spalten mit unterschiedlichen Namen wie diesen
Sie können UNION oder UNION ALL für die beiden Tabellen anwenden, die dieselbe Anzahl von Spalten haben. Sie haben jedoch einen anderen Namen oder Datentyp.
Wenn Sie eine UNIONOperation auf 2 Tabellen anwenden , werden alle doppelten Einträge vernachlässigt (alle Spaltenwerte der Zeile in einer Tabelle sind mit denen einer anderen Tabelle identisch). So was
SELECT*FROM Student
UNIONSELECT*FROM Teacher
das Ergebnis wird sein
Wenn Sie eine UNION ALLOperation auf 2 Tabellen anwenden , werden alle Einträge mit Duplikaten zurückgegeben (wenn zwischen einem Spaltenwert einer Zeile in 2 Tabellen ein Unterschied besteht). So was
SELECT*FROM Student
UNIONALLSELECT*FROM Teacher
Ausgabe
Performance:
Offensichtlich ist die Leistung von UNION ALL besser als die von UNION, da sie zusätzliche Aufgaben zum Entfernen der doppelten Werte ausführen. Sie können dies anhand der geschätzten Ausführungszeit überprüfen, indem Sie bei MSSQL Strg + L drücken
"Ja wirklich?" Für ein vierreihiges Ergebnis?! Ich würde denken, dass dies ein Szenario ist, in dem Sie UNIONAbsichten vermitteln möchten (dh keine Duplikate), da UNION ALLes unwahrscheinlich ist, dass in absoluten Zahlen ein realer Leistungsgewinn erzielt wird.
Tag, wenn
2
In sehr einfachen Worten besteht der Unterschied zwischen UNION und UNION ALL darin, dass UNION doppelte Datensätze weglässt, während UNION ALL doppelte Datensätze enthält.
Wahr ! UNION kann die Reihenfolge der beiden Unterergebnisse ändern.
Gracchus
6
Das ist falsch. A UNIONwird NICHT sortiert das Ergebnis in aufsteigender Reihenfolge. Jede Bestellung, die Sie in einem Ergebnis ohne Verwendung sehen, order byist reiner Zufall. Dem DBMS steht es frei, jede Strategie zu verwenden, die es für effizient hält, um die Duplikate zu entfernen. Dies könnte eine Sortierung sein, aber es könnte auch ein Hashing-Algorithmus oder etwas ganz anderes sein - und die Strategie ändert sich mit der Anzahl der Zeilen. Eine union, die mit 100 Zeilen sortiert erscheint, ist möglicherweise nicht mit 100.000 Zeilen versehen
a_horse_with_no_name
2
Ohne eine ORDER BY-Klausel in der Abfrage kann das RDBMS die Zeilen in beliebiger Reihenfolge zurückgeben. Die Beobachtung, dass die Ergebnismenge einer UNION-Operation "in aufsteigender Reihenfolge" zurückgegeben wird, ist nur ein Nebenprodukt einer von der Datenbank ausgeführten "sort eindeutig" -Operation. Das beobachtete Verhalten ist nicht garantiert. Verlassen Sie sich also nicht darauf. Wenn die Spezifikation Zeilen in einer bestimmten Reihenfolge zurückgeben soll, fügen Sie eine entsprechende ORDER BYKlausel hinzu.
Spencer7593
1
Unterschied zwischen Union und Union ALL In Sql
Was ist Union in SQL?
Der UNION-Operator wird verwendet, um die Ergebnismenge von zwei oder mehr Datensätzen zu kombinieren.
Each SELECT statement withinUNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order
Wichtig! Unterschied zwischen Oracle und MySQL: Nehmen wir an, dass t1 t2 keine doppelten Zeilen enthält, sondern einzelne Zeilen. Beispiel: t1 hat Verkäufe ab 2017 und t2 ab 2018
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNIONALLSELECT T2.YEAR, T2.PRODUCT FROM T2
In ORACLE UNION ALL werden alle Zeilen aus beiden Tabellen abgerufen. Das gleiche wird in MySQL auftreten.
Jedoch:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNIONSELECT T2.YEAR, T2.PRODUCT FROM T2
In ORACLE ruft UNION alle Zeilen aus beiden Tabellen ab, da zwischen t1 und t2 keine doppelten Werte vorhanden sind. Andererseits hat die Ergebnismenge in MySQL weniger Zeilen, da es doppelte Zeilen in Tabelle t1 und auch in Tabelle t2 gibt!
UNION entfernt doppelte Datensätze, UNION ALL hingegen nicht. Es muss jedoch der Großteil der Daten überprüft werden, die verarbeitet werden sollen, und die Spalte und der Datentyp müssen identisch sein.
Da Union intern "unterschiedliches" Verhalten verwendet, um die Zeilen auszuwählen, ist dies in Bezug auf Zeit und Leistung teurer. mögen
select project_id from t_project
unionselect project_id from t_project_contact
Das gibt mir 2020 Rekorde
andererseits
select project_id from t_project
unionallselect project_id from t_project_contact
gibt mir mehr als 17402 Zeilen
In der Prioritätsperspektive haben beide die gleiche Priorität.
Wenn dies nicht der Fall ist ORDER BY, UNION ALLkann a Zeilen nach und nach zurückbringen, während a UNIONSie bis zum Ende der Abfrage warten lässt, bevor Sie die gesamte Ergebnismenge auf einmal erhalten. Dies kann in einer Auszeitsituation einen Unterschied machen - a UNION ALLhält die Verbindung sozusagen am Leben.
Wenn Sie also ein Timeout-Problem haben und es keine Sortierung gibt und Duplikate kein Problem sind, UNION ALLkann dies hilfreich sein.
Verwenden Sie aus Gewohnheit immer UNION ALL . Verwenden Sie UNION nur in besonderen Fällen, wenn Sie Duplikate entfernen müssen, die extrem chaotisch sein können, und Sie können alles in den anderen Kommentaren hier lesen.
Wie erhöht dies den Wert gegenüber der akzeptierten Antwort?
Nick
@ Nick Es ist kürzere Antwort.
Mostafa Vatanpour
Kürzere können von Vorteil sein, wenn Sie einen wesentlichen Teil der akzeptierten Antwort lesen müssen, um diese Daten zu erhalten. In diesem Fall enthält die akzeptierte Antwort jedoch alle diese Informationen im allerersten Satz. Anschließend werden die Auswirkungen des Unterschieds im Detail erörtert.
Antworten:
UNION
Entfernt doppelte Datensätze (wobei alle Spalten in den Ergebnissen gleich sind),UNION ALL
nicht.Es gibt einen Leistungseinbruch bei der Verwendung von
UNION
anstelle vonUNION ALL
, da der Datenbankserver zusätzliche Arbeit leisten muss, um die doppelten Zeilen zu entfernen, aber normalerweise möchten Sie die doppelten nicht (insbesondere beim Entwickeln von Berichten).UNION Beispiel:
Ergebnis:
UNION ALL Beispiel:
Ergebnis:
quelle
Sowohl UNION als auch UNION ALL verketten das Ergebnis von zwei verschiedenen SQLs. Sie unterscheiden sich in der Art und Weise, wie sie mit Duplikaten umgehen.
UNION führt eine DISTINCT für die Ergebnismenge durch, wodurch doppelte Zeilen entfernt werden.
UNION ALL entfernt keine Duplikate und ist daher schneller als UNION.
Beispiel: Wenn wir zwei Tabellen haben, 1) Mitarbeiter und 2) Kunde
quelle
UNION
Entfernt Duplikate,UNION ALL
nicht jedoch.Um Duplikate zu entfernen, muss die Ergebnismenge sortiert werden. Dies kann sich je nach dem zu sortierenden Datenvolumen und den Einstellungen verschiedener RDBMS-Parameter (für Oracle
PGA_AGGREGATE_TARGET
mitWORKAREA_SIZE_POLICY=AUTO
oderSORT_AREA_SIZE
und) auf die Leistung der UNION auswirkenSOR_AREA_RETAINED_SIZE
wennWORKAREA_SIZE_POLICY=MANUAL
) .Grundsätzlich ist die Sortierung schneller, wenn sie im Speicher ausgeführt werden kann, es gilt jedoch die gleiche Einschränkung hinsichtlich des Datenvolumens.
Wenn Sie Daten benötigen, die ohne Duplikate zurückgegeben werden, müssen Sie dies natürlich tun UNION verwenden, abhängig von der Quelle Ihrer Daten.
Ich hätte den ersten Beitrag kommentiert, um den Kommentar "ist viel weniger performant" zu qualifizieren, habe aber nicht genügend Ruf (Punkte), um dies zu tun.
quelle
In ORACLE: UNION werden BLOB- (oder CLOB-) Spaltentypen nicht unterstützt, UNION ALL jedoch.
quelle
von http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
quelle
Sie können Duplikate vermeiden und trotzdem viel schneller als UNION DISTINCT (das eigentlich mit UNION identisch ist) ausführen, indem Sie die folgende Abfrage ausführen:
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
Beachten Sie das
AND a!=X
Teil. Das ist viel schneller als UNION.quelle
UNION
-UNION
auch Duplikate entfernt , die durch die Unterabfragen zurückgegeben werden, während Ihr Ansatz nicht.Um meine zwei Cent zur Diskussion hier hinzuzufügen: Man könnte den
UNION
Operator als reine, SET-orientierte UNION verstehen - zB set A = {2,4,6,8}, set B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}Wenn Sie mit Mengen arbeiten, möchten Sie nicht, dass die Zahlen 2 und 4 zweimal erscheinen, da sich ein Element entweder in einer Menge befindet oder nicht .
In der SQL-Welt möchten Sie möglicherweise alle Elemente aus den beiden Sätzen zusammen in einer "Tasche" anzeigen {2,4,6,8,1,2,3,4}. Und zu diesem Zweck bietet T-SQL dem Bediener
UNION ALL
.quelle
UNION ALL
wird von T-SQL nicht "angeboten".UNION ALL
ist Teil des ANSI SQL-Standards und nicht spezifisch für MS SQL Server.UNION
Der
UNION
Befehl wird verwendet, um verwandte Informationen aus zwei Tabellen auszuwählen, ähnlich wie derJOIN
Befehl. Bei Verwendung desUNION
Befehls müssen jedoch alle ausgewählten Spalten vom gleichen Datentyp sein. MitUNION
werden nur unterschiedliche Werte ausgewählt.UNION ALL
Der
UNION ALL
Befehl entspricht demUNION
Befehl, außer dassUNION ALL
alle Werte ausgewählt werden.Der Unterschied zwischen
Union
undUnion all
besteht darin, dassUnion all
keine doppelten Zeilen entfernt werden. Stattdessen werden nur alle Zeilen aus allen Tabellen abgerufen, die Ihren Abfragespezifikationen entsprechen, und sie werden zu einer Tabelle kombiniert.Eine
UNION
Anweisung wirkt sich effektivSELECT DISTINCT
auf die Ergebnismenge aus. Wenn Sie wissen, dass alle zurückgegebenen Datensätze von Ihrer Gewerkschaft eindeutig sind, verwenden SieUNION ALL
stattdessen, um schnellere Ergebnisse zu erzielen.quelle
UNION
undUNION ALL
sollte auf allen SQL Servern funktionieren.Sie sollten unnötige
UNION
s vermeiden, da diese ein großes Leistungsleck darstellen. Als Faustregel verwenden,UNION ALL
wenn Sie nicht sicher sind, welche Sie verwenden sollen.quelle
UNION - führt zu unterschiedlichen Datensätzen,
während
UNION ALL - zu allen Datensätzen einschließlich Duplikaten führt.
Beide sind blockierende Operatoren und daher bevorzuge ich persönlich die Verwendung von JOINS gegenüber blockierenden Operatoren (UNION, INTERSECT, UNION ALL usw.) jederzeit.
Um zu veranschaulichen, warum der Betrieb der Union im Vergleich zum Auschecken der Union All eine schlechte Leistung erbringt, sehen Sie sich das folgende Beispiel an.
Es folgen die Ergebnisse der Operationen UNION ALL und UNION.
Eine UNION-Anweisung führt effektiv ein SELECT DISTINCT für die Ergebnismenge durch. Wenn Sie wissen, dass alle zurückgegebenen Datensätze von Ihrer Gewerkschaft eindeutig sind, verwenden Sie stattdessen UNION ALL, um schnellere Ergebnisse zu erzielen.
Die Verwendung von UNION führt zu eindeutigen Sortiervorgängen im Ausführungsplan. Der Beweis, um diese Aussage zu beweisen, ist unten gezeigt:
quelle
UNION
/UNION ALL
).union
Verwendung einer Kombination ausjoin
s und einigen wirklich bösencase
s erzeugen , aber es macht es nahezu unmöglich, die Abfrage zu lesen und zu pflegen, und meiner Erfahrung nach ist sie auch für die Leistung schrecklich. Vergleichen Sie:select foo.bar from foo union select fizz.buzz from fizz
gegenselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
Mit union werden unterschiedliche Werte aus zwei Tabellen ausgewählt, wobei mit union all alle Werte einschließlich Duplikate aus den Tabellen ausgewählt werden
quelle
Es ist gut, mit einem Venn-Diagramm zu verstehen.
Hier ist der Link zur Quelle. Es gibt eine gute Beschreibung.
quelle
()
wird ein zweites Mal gezeigt. Da dasunion all
Ergebnis keine Menge ist, sollten Sie eigentlich nicht versuchen, es mit einem Venn-Diagramm zu zeichnen!(Aus Microsoft SQL Server Book Online)
UNION [ALL]
ALLE
UNION
Dies dauert zu lange, daDISTINCT
auf die Ergebnisse doppelte Zeilen angewendet werden.ist äquivalent zu:
UNION ALL
Die Ergebnisse werden in beliebiger Reihenfolge für die ErgebnisseUNION
angezeigt. Die Ergebnisse werden jedoch so angezeigt, wieORDER BY 1, 2, 3, ..., n (n = column number of Tables)
sie auf die Ergebnisse angewendet werden. Sie können diesen Nebeneffekt sehen, wenn Sie keine doppelte Zeile haben.quelle
Ich füge ein Beispiel hinzu,
UNION wird mit eindeutig -> langsamer zusammengeführt, da ein Vergleich erforderlich ist (Wählen Sie in Oracle SQL Developer die Abfrage aus und drücken Sie F10, um die Kostenanalyse anzuzeigen).
UNION ALL , es verschmilzt ohne Unterschied -> schneller.
und
quelle
UNION
führt den Inhalt zweier strukturkompatibler Tabellen zu einer einzigen kombinierten Tabelle zusammen.Der Unterschied zwischen
UNION
undUNION ALL
besteht darin, dassUNION will
doppelte Datensätze weggelassenUNION ALL
werden, während doppelte Datensätze enthalten sind.Union
Die Ergebnismenge ist in aufsteigender Reihenfolge sortiert, während dieUNION ALL
Ergebnismenge nicht sortiert istUNION
führt eineDISTINCT
Ergebnismenge durch, um doppelte Zeilen zu entfernen. WährendUNION ALL
nicht Duplikate entfernen und daher ist es schneller alsUNION
. *Hinweis : Die Leistung von ist
UNION ALL
in der Regel besser alsUNION
, daUNION
der Server die zusätzliche Arbeit zum Entfernen von Duplikaten ausführen muss. In Fällen, in denen sicher ist, dass keine Duplikate vorhanden sind oder in denen Duplikate kein Problem darstellen, wird die Verwendung vonUNION ALL
aus Leistungsgründen empfohlen.quelle
ORDER BY
, werden sortierte Ergebnisse nicht garantiert. Vielleicht haben Sie einen bestimmten SQL-Anbieter im Sinn (selbst dann in aufsteigender Reihenfolge, was genau ...?), Aber diese Frage hat keine herstellerspezifischen Tags.Angenommen, Sie haben zwei Tischlehrer und -schüler
Beide haben 4 Spalten mit unterschiedlichen Namen wie diesen
Sie können UNION oder UNION ALL für die beiden Tabellen anwenden, die dieselbe Anzahl von Spalten haben. Sie haben jedoch einen anderen Namen oder Datentyp.
Wenn Sie eine
UNION
Operation auf 2 Tabellen anwenden , werden alle doppelten Einträge vernachlässigt (alle Spaltenwerte der Zeile in einer Tabelle sind mit denen einer anderen Tabelle identisch). So wasdas Ergebnis wird sein
Wenn Sie eine
UNION ALL
Operation auf 2 Tabellen anwenden , werden alle Einträge mit Duplikaten zurückgegeben (wenn zwischen einem Spaltenwert einer Zeile in 2 Tabellen ein Unterschied besteht). So wasAusgabe
Performance:
Offensichtlich ist die Leistung von UNION ALL besser als die von UNION, da sie zusätzliche Aufgaben zum Entfernen der doppelten Werte ausführen. Sie können dies anhand der geschätzten Ausführungszeit überprüfen, indem Sie bei MSSQL Strg + L drücken
quelle
UNION
Absichten vermitteln möchten (dh keine Duplikate), daUNION ALL
es unwahrscheinlich ist, dass in absoluten Zahlen ein realer Leistungsgewinn erzielt wird.In sehr einfachen Worten besteht der Unterschied zwischen UNION und UNION ALL darin, dass UNION doppelte Datensätze weglässt, während UNION ALL doppelte Datensätze enthält.
quelle
Eine weitere Sache, die ich hinzufügen möchte-
Union : - Die Ergebnismenge ist in aufsteigender Reihenfolge sortiert.
Union All : - Die Ergebnismenge ist nicht sortiert. Zwei Abfrage-Ausgaben werden nur angehängt.
quelle
UNION
wird NICHT sortiert das Ergebnis in aufsteigender Reihenfolge. Jede Bestellung, die Sie in einem Ergebnis ohne Verwendung sehen,order by
ist reiner Zufall. Dem DBMS steht es frei, jede Strategie zu verwenden, die es für effizient hält, um die Duplikate zu entfernen. Dies könnte eine Sortierung sein, aber es könnte auch ein Hashing-Algorithmus oder etwas ganz anderes sein - und die Strategie ändert sich mit der Anzahl der Zeilen. Eineunion
, die mit 100 Zeilen sortiert erscheint, ist möglicherweise nicht mit 100.000 Zeilen versehenORDER BY
Klausel hinzu.Unterschied zwischen Union und Union ALL In Sql
Was ist Union in SQL?
Der UNION-Operator wird verwendet, um die Ergebnismenge von zwei oder mehr Datensätzen zu kombinieren.
Union gegen Union alle mit Beispiel
quelle
Wichtig! Unterschied zwischen Oracle und MySQL: Nehmen wir an, dass t1 t2 keine doppelten Zeilen enthält, sondern einzelne Zeilen. Beispiel: t1 hat Verkäufe ab 2017 und t2 ab 2018
In ORACLE UNION ALL werden alle Zeilen aus beiden Tabellen abgerufen. Das gleiche wird in MySQL auftreten.
Jedoch:
In ORACLE ruft UNION alle Zeilen aus beiden Tabellen ab, da zwischen t1 und t2 keine doppelten Werte vorhanden sind. Andererseits hat die Ergebnismenge in MySQL weniger Zeilen, da es doppelte Zeilen in Tabelle t1 und auch in Tabelle t2 gibt!
quelle
UNION entfernt doppelte Datensätze, UNION ALL hingegen nicht. Es muss jedoch der Großteil der Daten überprüft werden, die verarbeitet werden sollen, und die Spalte und der Datentyp müssen identisch sein.
Da Union intern "unterschiedliches" Verhalten verwendet, um die Zeilen auszuwählen, ist dies in Bezug auf Zeit und Leistung teurer. mögen
Das gibt mir 2020 Rekorde
andererseits
gibt mir mehr als 17402 Zeilen
In der Prioritätsperspektive haben beide die gleiche Priorität.
quelle
Wenn dies nicht der Fall ist
ORDER BY
,UNION ALL
kann a Zeilen nach und nach zurückbringen, während aUNION
Sie bis zum Ende der Abfrage warten lässt, bevor Sie die gesamte Ergebnismenge auf einmal erhalten. Dies kann in einer Auszeitsituation einen Unterschied machen - aUNION ALL
hält die Verbindung sozusagen am Leben.Wenn Sie also ein Timeout-Problem haben und es keine Sortierung gibt und Duplikate kein Problem sind,
UNION ALL
kann dies hilfreich sein.quelle
UNION und UNION ALL werden verwendet, um zwei oder mehr Abfrageergebnisse zu kombinieren.
Der Befehl UNION wählt unterschiedliche und verwandte Informationen aus zwei Tabellen aus, wodurch doppelte Zeilen eliminiert werden.
Auf der anderen Seite wählt der Befehl UNION ALL alle Werte aus beiden Tabellen aus, wodurch alle Zeilen angezeigt werden.
quelle
Verwenden Sie aus Gewohnheit immer UNION ALL . Verwenden Sie UNION nur in besonderen Fällen, wenn Sie Duplikate entfernen müssen, die extrem chaotisch sein können, und Sie können alles in den anderen Kommentaren hier lesen.
quelle
UNION ALL
funktioniert auch mit mehr Datentypen. Zum Beispiel beim Versuch, räumliche Datentypen zu vereinen. Zum Beispiel:wird werfen
The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
Allerdings
union all
wird nicht.quelle
Der einzige Unterschied ist:
"UNION" entfernt doppelte Zeilen.
"UNION ALL" entfernt keine doppelten Zeilen.
quelle