[SQL] UNION, UNION ALL (+ DISTINCT) 개념과 성능

이도형·2026년 1월 7일

쿼리 튜닝🔧

목록 보기
4/4

UNION

두 개 이상 SELECT 결과 결합 시 중복 제거를 수행

SELECT name
  FROM employees -- 'LEE', 'KIM', 'PARK
 UNION
SELECT name
  FROM managers; -- 'CHOI', 'YANG', 'KIM'
  
-- 결과 : 'LEE', 'KIM', 'PARK', 'CHOI', 'YANG'
  • DISTINCT 처리가 들어가 UNION ALL 보다는 느림

UNION ALL

두 개 이상 SELECT 결과 결합 시 나오는 행 전부 합침

SELECT name
  FROM employees -- 'LEE', 'KIM', 'PARK
 UNION ALL
SELECT name
  FROM managers; -- 'CHOI', 'YANG', 'KIM'
  
-- 결과 : 'LEE', 'KIM', 'PARK', 'CHOI', 'YANG', 'KIM'
  • 상대적으로 UNION보다는 빠른 속도
  • 중복 포함 결과 필요 시 사용

UNION과 UNION ALL + DISTINCT

아래 UNION

SELECT name
  FROM employees -- 'LEE', 'KIM', 'PARK
 UNION
SELECT name
  FROM managers; -- 'CHOI', 'YANG', 'KIM'
  
-- 결과 : 'LEE', 'KIM', 'PARK', 'CHOI', 'YANG'

UNION ALLDISTINCT로 다음과 같이 구현할 수 있다.

SELECT DISTINCT name 
FROM (
    SELECT name FROM employees
    UNION ALL
    SELECT name FROM managers
) combined_names
  
-- 결과 : 'LEE', 'KIM', 'PARK', 'CHOI', 'YANG'

UNION

  • 높은 가독성
  • DB 옵티마이저로 인해 최적화가 잘 되어 있음

UNION ALL + DISTINCT

  • 중복이 거의 없는 경우 속도가 더 빠를 수 있음

상황에 따르지만 대게 UNION이 메모리/속도 측면에서 더 유리하다.

만약 개별 테이블 내에서 중복 데이터가 많다면

개별 테이블 내 중복 데이터가 많다면 아래와 같은 쿼리 구성도 가능하다.

SELECT col_name FROM (SELECT DISTINCT col_name FROM table1) t1
UNION
SELECT col_name FROM (SELECT DISTINCT col_name FROM table2) t2
UNION
SELECT col_name FROM (SELECT DISTINCT col_name FROM table3) t3
UNION
SELECT col_name FROM (SELECT DISTINCT col_name FROM table4) t4;

결론

단순히 UNION만 쓰지말고 다양한 생각과 테스트에 대한 고려가 필요💡

profile
열심히 살고 싶습니다! 일하고 싶습니다 :)

0개의 댓글