[SQL 레벨업] 10강 UNION이 필요한 경우

2024. 1. 4. 23:14·BOOK/SQL 레벨업

10강 | UNION이 필요한 경우

정리

  1. UNION 사용할 수 밖에 없는 경우
    ▶️ 여러개 테이블 검색 결과를 머지할 때
  2. UNION 사용 좋은 점
    • 좋은 인덱스를 사용한다. union을 사용하지 않을 시 풀스캔 발생 가능성
    • 이전 블로그에 작성한 내용처럼 case도 이용이 가능하지만 필요없는 결합으로 성능이 낮아질 가능성이 있다.
  3. 결론
    • 상황에 맞게 적절히 사용


예제문제

아래 테이블에서 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
'BOOK/SQL 레벨업' 카테고리의 다른 글
  • [SQL 레벨업] 13강 자르기
  • [SQL 레벨업] 12강 집약
  • [SQL 레벨업] 9장 집계와 조건분기
  • [SQL 레벨업] 8강 UNION을 사용한 쓸데없이 긴 표현
gani+
gani+
꾸준히 기록할 수 있는 사람이 되자 !
  • gani+
    Gani_Dev :)
    gani+
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • 당장 프로젝트 (2)
        • 트러블슈팅 (0)
      • 댕댕어디가 프로젝트 (11)
        • 트러블슈팅 (3)
        • MSA (8)
      • 개발일지 (2)
      • BOOK (12)
        • SQL 레벨업 (10)
      • 프로젝트 (0)
      • ELK (5)
      • 알고리즘 (9)
      • CS (2)
        • 디자인패턴 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DP
    해쉬
    SW마에스트로
    이것이코딩테스트다
    정렬
    다이나믹프로그래밍
    SWMaestro14
    dfs
    4673
    섬의개수
    최단경로
    후기
    백준4963
    다익스트라
    알고리즘
    이것이 코딩 테스트다
    14기
    플로이드워셔
    백준
    순차탐색
    4963
    이진탐색
    완전탐색
    소마
    9095
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gani+
[SQL 레벨업] 10강 UNION이 필요한 경우
상단으로

티스토리툴바