Jeg har nogle gange konstateret, at mange ikke har fuld forståelse af, hvad DISTINCT, UNION og UNION ALL gør, når de benyttes i sammenhæng med hinanden. Det vil jeg nu prøve at råde bod på. Forestil dig, at du har SQL-kald SELECT X, der returnerer rækkerne A, B, B og C. Du har et andet SQL-kald SELECT Y, der returnerer rækkerne B, C og D.
Vi laver nu et tredie SQL-kald nemlig SELECT X UNION ALL SELECT Y. Dette SQL-kald vil returnere rækkerne A, B, B, C, B, C og D. UNION ALL gør altså ikke andet end at danne et samlet resultat af to SQL-kald, hvor samtlige rækker fra begge SQL-kald indgår i resultatet, selv om nogle af rækkerne er ens.
Lad os nu prøve med SQL-kaldet SELECT X UNION SELECT Y. Dette SQL-kald vil returnere rækkerne A, B, C og D. UNION uden ALL fjerner altså alle ens rækker på nær een. Række B og C optræder altså kun een gang. Vi kan nu konkludere, at UNION er en del dyrere end en UNION ALL.
Hvis du på forhånd ved, at din SELECT X og SELECT Y ikke returnerer den samme række to eller flere gange, og du derudover ved, at SELECT X og SELECT Y ikke returnerer fælles rækker, så vil jeg kraftigt anbefale at bruge UNION ALL mellem SELECT X og SELECT Y, da UNION uden ALL i dette tilfælde kun vil give et dyrt og unødvendigt overhead. Faktisk er der overraskende mange UNION's, der opfylder disse kriterier.
Hvad så med SQL-kaldet SELECT DISTINCT X UNION SELECT Y? Det vil returnere nøjagtig det samme antal rækker som SELECT X UNION SELECT Y. Her vil tilføjelsen af DISTINCT kun medføre et unødvendigt overhead, da UNION netop sørger for at fjerne de samme rækker som en DISTINCT gør. UNION skelner ikke mellem rækker returneret af den ene eller den anden SELECT.
Til sidst prøver vi lige med SELECT DISTINCT X UNION ALL SELECT Y. Dette SQL-kald vil returnere A, B, C, B, C, D. Vi kan altså konstatere, at i forbindelse med en UNION ALL har en DISTINCT fuld berettigelse.
Til sidst vil jeg tilføje, at UNION og DISTINCT er to rigtige CPU-slugere. DB2 vil altid foretage sorteringer i forbindelse med disse to SQL-udtryk. Også selv om der ikke er nogen grund til at sortere. DB2 behøver derimod ikke at lave sorteringer i forbindelse med UNION ALL, hvor DB2 jo bare skal returnere alle rækkerne fra først SELECT X og derefter fra SELECT Y.