[SQL] SQLD union/union all 차이점

qwe8851·2022년 8월 10일
0

🗄️ DB

목록 보기
3/9

UNION/ UNION ALL

  1. UNION(DISTINCYT) : 중복되는 레코드 제거
  2. UNION ALL : 별도의 중복 제거 과정을 거치지 않음

중복 여부의 판단은 SELECT된 튜플 속에 속해있는 모든 컬럼의 값들 자체가 체크의 기준이 됨.

처리과정

mysql 내부적으로 UNION과 UNION ALL을 처리하는 과정을 보면,
1. 최종결과에 적합한 임시테이블(Temporary Table)을 메모리 테이블로 생성
2. union인 경우, temporary테이블의 모든 컬럼으로 union hash인덱스 생성
3. 서브쿼리1 실행 후 결과를 temporary테이블에 복사
4. 서브쿼리2 실행 후 결과를 temporary테이블에 복사
4-1. 만약 3, 4번 과정ㅇ서 temporary테이블이 특정 사이즈 이상으로 커지면
temporay테이블을 disk temporary테이블로 변경(이때 uniqy hash인덱스는 uniqy B-tree인덱스로 변경됨)
5. temporary 테이블을 읽어서 client에 결과 전송
6. temporary 테이블 삭제

  • 이 떄, union과 union all의 차이점은
    2번 temporary 테이블에서 인덱스를 생성하는지 아닌지의 차이

실행 속도

UNION ALL > UNION
union은 all 후 중복제거를 하기 때문에 속도가 더 느림

마지막으로..

  • union과 union all 둘 다 사실 좋은 SQL작성법은 아님
    union이 필요하다는 것은 사실 두 엔터티(테이블)가 하나의 엔터티(테이블)로 통합되어야 할 엔터티들이 있는데, 알 수 없는 이유로 분리 운영되는 경우가 多
  • 두 집합에 절대 중복된 튜플(레코드)가 발생할 수 없다는 보장이 있다면 union all을 꼭 사용해야 함
    두 집합에서 모두 각각의 pk를 조회하는데, 그 두 집합의 pk가 절대 중복되지 않는 형태
  • 중복이 있다 하더라도 그렇게 문제가 되지 않는다면 union보다는 union all을 사용해야 함
  • 만약 union이나 union all을 사용해야 한다면, 최소 필요 칼럼만 select해야 함


WITH

가공한 테이블을 쿼리 안에서 계속 쓰다보면 가독성이 떨어질 수 있음

이때 with구문을 사용하면 서브쿼리로 추출된 데이터를 별칭을 지정해 임시테이블의나 view로 관리할 수 있는데
이를 통해 특정 서브쿼리 결과를 관리할 수 있고, 같은 서브쿼리가 필요할 때 별칭으로 뷰를 불러오면 쿼리문이 그대로 실행됨.

with은 가상 테이블, 즉 테이블에 있어 메모리를 차지한다는 단점이 있음

with절을 사용하는 이유는,
temp라는 임시 테이블을 사용해 쿼리를 저장해 놓고 데이터를 엑세스하기 때문에 성능이 좋아짐

하지만, 너무 많이 쓰면 임시 테이블이 견딜 수 있는 정도를 넘어 느려지게 됨ㅜ




# Summary

  • UNION : 중복 제거(distinct)
  • UNION ALL : 중복 허용
profile
FrontEnd Developer with React, TypeScript

0개의 댓글