DATABASE/SQL 입문

UNION & UNION ALL

nsh95 2024. 5. 30. 09:34

 

여러 개의 SELECT 문 결과를 합치기 위해서는 UNION, UNION ALL을 사용하면 된다.
UNION을 사용할 경우 합쳐진 결과에서 중복을 제거한 결과를 반환하고
UNION ALL을 사용하면 중복을 제거하지 않고 합쳐진 결과를 그대로 반환한다.
UNION ALL이 중복을 제거하지 않으므로 UNION 보다 속도가 빠르다.

 

UNION : 각 쿼리의 결과 합을 반환하는 합집합 (중복제거)
UNION ALL : 각 쿼리의 모든 결과를 포함한 합집합 (중복제거 안함)
중복을 제거하지 않으므로 UNION 보다 속도가 빠르다.

 

MySQL 내부적으로  UNION ALL과 UNION을 처리하는 과정

1. 최종 UNION [ALL / DISTINCT ] 결과에 적합한 임시 테이블을 메모리 테이블로 생성
2. UNION 또는 UNION DISTINCT의 경우, 임시 테이블의 모든 컬럼으로 Unique Hash 인덱스를 생성
3. 첫 번째 서브쿼리를 실행 후 결과를 임시 테이블에 복사
4. 두 번째 서브쿼리를 실행 후 결과를 임시 테이블에 복사
5. 임시 테이블이 특정 사이즈 이상으로 커질 경우, 임시 테이블을 디스크 임시 테이블로 변경
6. 임시 테이블을 읽어서 클라이언트에 결과를 전송
7. 작업 완료 후  임시 테이블 삭제

UNION 하는 컬럼의 수가 많아지고 레코드의 사이즈가 커질수록 양쪽 작업에 모두에게 불리할 수 있지만,
UNION ALL 보다는 UNION에 더 큼 악영향을 미칠 수 있다.

Check Point

UNION, UNION ALL은 좋은 SQL 작성 방법이 아니다.
모델링 차원에서 테이블을 통합하는 것이 더 좋다!
UNION을 사용해야 한다면 필요한 컬럼만 SELECT 하도록 하고, 가능하면 UNION ALL을 사용하는 것이 좋다.