Wat is het verschil tussen UNION
en UNION ALL
?
Antwoord 1, autoriteit 100%
UNION
verwijdert dubbele records (waarbij alle kolommen in de resultaten hetzelfde zijn), UNION ALL
niet.
Er is een prestatiehit bij het gebruik van UNION
in plaats van UNION ALL
, aangezien de databaseserver extra werk moet doen om de dubbele rijen te verwijderen, maar meestal wilt u dit niet de duplicaten (vooral bij het ontwikkelen van rapporten).
UNION Voorbeeld:
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
Resultaat:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
UNION ALL voorbeeld:
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
Resultaat:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
Antwoord 2, autoriteit 16%
Zowel UNION als UNION ALL voegen het resultaat van twee verschillende SQL’s samen. Ze verschillen in de manier waarop ze met duplicaten omgaan.
-
UNION voert een DISTINCT uit op de resultatenset, waarbij dubbele rijen worden geëlimineerd.
-
UNION ALL verwijdert geen duplicaten en is daarom sneller dan UNION.
Opmerking:Bij het gebruik van deze opdrachten moeten alle geselecteerde kolommen van hetzelfde gegevenstype zijn.
Voorbeeld: als we twee tabellen hebben, 1) Medewerker en 2) Klant
- Werknemerstabelgegevens:
- Klantentabelgegevens:
- UNION-voorbeeld (alle dubbele records worden verwijderd):
- UNION ALL Voorbeeld (het voegt alleen records samen, elimineert geen duplicaten, dus het is sneller dan UNION):
Antwoord 3, autoriteit 3%
UNION
verwijdert duplicaten, terwijl UNION ALL
dat niet doet.
Om duplicaten te verwijderen, moet de resultatenset worden gesorteerd, en dit kanvan invloed zijn op de prestaties van de UNION, afhankelijk van de hoeveelheid gegevens die wordt gesorteerd en de instellingen van verschillende RDBMS parameters ( Voor Oracle PGA_AGGREGATE_TARGET
met WORKAREA_SIZE_POLICY=AUTO
of SORT_AREA_SIZE
en SOR_AREA_RETAINED_SIZE
indien WORKAREA_SIZE_POLICY=MANUAL
).
In principe is het sorteren sneller als het in het geheugen kan worden uitgevoerd, maar hetzelfde voorbehoud over de hoeveelheid gegevens is van toepassing.
Als u gegevens wilt retourneren zonder duplicaten, moetu natuurlijk UNION gebruiken, afhankelijk van de bron van uw gegevens.
Ik zou hebben gereageerd op de eerste post om de opmerking “is veel minder presterend” te kwalificeren, maar ik heb onvoldoende reputatie (punten) om dit te doen.
Antwoord 4, autoriteit 2%
In ORACLE: UNION ondersteunt geen BLOB (of CLOB) kolomtypes, UNION ALL wel.