010. 그래도 UNION이 필요한 경우 - llighter/database GitHub Wiki

SQL 레벨업

1. UNION을 사용할 수밖에 없는 경우

  • 머지 대상이 되는 SELECT 구문들에서 사용하는 테이블이 다른 경우
SELECT col_1
   FROM TABLE_A
   WHERE col_2 = 'A'
UNION ALL
SELECT col_3
   FROM TABLE_B
   WHERE col_4 = 'B';
  • CASE 식을 사용해되 됨.
  • 하지만 불필요한 결합이 발생하여 성능적으로 악영향 발생 <-> UNION은 발생하지 않는다.
  • 따라서 실행 계획 등을 확인하여 결정해야 한다.

2. UNION을 사용하는 것이 성능적으로 더 좋은 겨우

예제 구성해 볼 것!

- OR을 사용한 방법

예제 코드

  • 테이블에 접근은 3에서 1로 감소
  • 데이틀 풀 스캔 수행
  • 따라서 테이블 접근을 줄이고 풀스캔 vs. 테이블 접근이 많은 대신 인덱스 스캔 선택!
  • 이것은 테이블 크기와 검색 조건에 따른 선택 비율(레코드 히트율)에 따라 답이 달리진다.
  • 테이블이 크고, WHERE 조건으로 선택되는 레코드 수가 충분히 작다면 UNION이 빠르다.

- IN을 사용한 방법

예제 코드

  • 좀 더 간단하게 작성할 수 있지만 과정과 결과는 OR과 같다.

- CASE 식을 사용한 방법

예제 코드

  • 실행 계획은 같다.
  • 비지니스 룰이 바뀌면 위의 방법들과 결과가 다를 수 있다.
  • cf. 연습문제