010. 그래도 UNION이 필요한 경우 - llighter/database GitHub Wiki
UNION
을 사용할 수밖에 없는 경우
1. - 머지 대상이 되는
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
은 발생하지 않는다. - 따라서 실행 계획 등을 확인하여 결정해야 한다.
UNION
을 사용하는 것이 성능적으로 더 좋은 겨우
2. 예제 구성해 볼 것!
OR
을 사용한 방법
- 예제 코드
- 테이블에 접근은 3에서 1로 감소
- 데이틀 풀 스캔 수행
- 따라서 테이블 접근을 줄이고 풀스캔 vs. 테이블 접근이 많은 대신 인덱스 스캔 선택!
- 이것은 테이블 크기와 검색 조건에 따른 선택 비율(레코드 히트율)에 따라 답이 달리진다.
- 테이블이 크고,
WHERE
조건으로 선택되는 레코드 수가 충분히 작다면UNION
이 빠르다.
IN
을 사용한 방법
- 예제 코드
- 좀 더 간단하게 작성할 수 있지만 과정과 결과는
OR
과 같다.
CASE
식을 사용한 방법
- 예제 코드
- 실행 계획은 같다.
- 비지니스 룰이 바뀌면 위의 방법들과 결과가 다를 수 있다.
- cf. 연습문제