10강 | UNION이 필요한 경우
정리
- UNION 사용할 수 밖에 없는 경우
▶️ 여러개 테이블 검색 결과를 머지할 때 - UNION 사용 좋은 점
- 좋은 인덱스를 사용한다. union을 사용하지 않을 시 풀스캔 발생 가능성
- 이전 블로그에 작성한 내용처럼 case도 이용이 가능하지만 필요없는 결합으로 성능이 낮아질 가능성이 있다.
- 결론
- 상황에 맞게 적절히 사용
- 상황에 맞게 적절히 사용
예제문제
아래 테이블에서 date가 2013-11-01이고,flag가 True인 레코드를 검색
- threeElements 테이블

- 기대값

풀이법
- 테이블 생성

1) UNION을 사용
코드
select `key`,name,date_1,flg_1,date_2,flg_2,date_3,flg_3
from example.threeElements
where date_1='2013-11-01' and flg_1 ='T'
union
select `key`,name,date_1,flg_1,date_2,flg_2,date_3,flg_3
from example.threeElements
where date_2='2013-11-01' and flg_2 ='T'
union
select `key`,name,date_1,flg_1,date_2,flg_2,date_3,flg_3
from example.threeElements
where date_3='2013-11-01' and flg_3 ='T';
결과값

실행계획
모든 테이블이 풀스캔되고 있음을 확인할 수 있다.

인덱스 설정
CREATE INDEX IDX_1 ON example.threeElements(date_1,flg_1);
CREATE INDEX IDX_2 ON example.threeElements(date_2,flg_2);
CREATE INDEX IDX_3 ON example.threeElements(date_3,flg_3);
인덱스 추가 후 실행계획 확인
인덱스를 사용하여 필터링하고 있음을 확인하였다.

2) OR을 사용하는 방법
코드
explain select `key`,name,date_1,flg_1,date_2,flg_2,date_3,flg_3
from example.threeElements
where(date_1='2013-11-01' and flg_1 ='T') or (date_2='2013-11-01' and flg_2 ='T') or ( date_3='2013-11-01' and flg_3 ='T');
실행계획
풀스캔으로 진행

인덱스 추가 후 실행계획 확인
인덱스를 탄다. 따라서 테이블의 크기나 where 조건 등 상황에 따라 인덱스를 설정할 것인지,,OR 또는 UNION을 사용할 것인지 정하면 될 것 같다..!

3) IN을 사용하는 방법
코드
select `key`,name,date_1,flg_1,date_2,flg_2,date_3,flg_3
from example.threeElements
where('2013-11-01','T') IN ((date_1,flg_1),(date_2,flg_2),(date_3,flg_3));
실행계획

인덱스 추가 후 실행계획 확인
인덱스를 추가해도 동일하게 풀스캔하는 것을 확인할 수 있다. 그 이유는 IN 연산자를 이용했을 때 IN에 포함된 데이터가 비율이 높으면 인덱스보다 풀스캔하는 것이 낫다고 데이터베이스가 판단하여 인덱스를 타지 않기 때문이다.
추가적으로 Index를 타지 않는 쿼리 를 참고하면 좋을 것 같다!

4) CASE 식을 이용하는 방법
코드
select `key`,name,date_1,flg_1,date_2,flg_2,date_3,flg_3
from example.threeElements
where case when date_1 ='2013-11-01' then flg_1
when date_2='2013-11-01' then flg_2
when date_3='2013-11-01' then flg_3
else null end = 'T';
실행계획

인덱스 추가 후 실행계획 확인
동일하게 인덱스를 타지 않고 풀스캔을 진행한다.
case가 적용된 컬럼은 인덱스를 타지 않는다고 합니댱..
참고만했움..! https://jaejade.tistory.com/128

결론
테이블의 크기, 조건 등 상황에 따라 풀스캔이 옳은지 , 인덱스가 옳은지 또는 UNION이 좋은지 판단하면 될 것같다..! 다만 UNION이 인덱스를 잘 탈 수 있으므로, 풀스캔보다 인덱스가 낫다면 UNION 사용하는 것이 성능적으로 더 좋을 수 있다..!
'BOOK > SQL 레벨업' 카테고리의 다른 글
[SQL 레벨업] 15강 반복계의 공포 (1) | 2024.01.25 |
---|---|
[SQL 레벨업] 13강 자르기 (1) | 2024.01.23 |
[SQL 레벨업] 12강 집약 (0) | 2024.01.10 |
[SQL 레벨업] 9장 집계와 조건분기 (0) | 2023.12.13 |
[SQL 레벨업] 8강 UNION을 사용한 쓸데없이 긴 표현 (0) | 2023.12.11 |