SQL UNION ALL 완벽 가이드: 속도, 성능, 활용 방법

UNION ALL은 SQL에서 데이터를 병합하거나 처리할 때 자주 사용되는 강력한 도구입니다. 이 글에서는 UNION ALL의 개념부터 성능 최적화, 실제 활용 사례, 그리고 다른 SQL 기능과의 비교까지 체계적으로 살펴봅니다. 각 주제별로 세부적인 설명과 코드 예제를 통해 실무에서 바로 적용할 수 있는 팁을 제공하니 끝까지 읽어보세요! 😊



UNION ALL의 기본 개념

SQL의 UNION ALL은 여러 SELECT 쿼리의 결과를 하나로 결합할 때 사용됩니다. UNION ALL은 중복된 데이터를 제거하지 않으므로, 결과가 그대로 출력됩니다. 따라서 UNION보다 속도가 빠르고 리소스를 적게 사용합니다.


SELECT column1 FROM table1
UNION ALL
SELECT column1 FROM table2;
    

위의 쿼리는 table1table2의 데이터를 결합하며, 중복된 데이터도 포함됩니다.

주요 특징

  • 중복 포함: 데이터를 단순히 병합하기 때문에 중복된 레코드도 결과에 포함됩니다.
  • 빠른 성능: 중복 제거 과정이 없기 때문에 처리 속도가 더 빠릅니다.
  • 사용 목적: 단순히 여러 테이블이나 쿼리 결과를 병합하려는 경우에 적합합니다.


UNION ALL vs UNION: 차이점과 사용 시기

두 기능은 비슷해 보이지만, 동작 방식과 사용 목적에서 큰 차이가 있습니다.

1. 중복 제거 여부

  • UNION: 결과에서 중복된 데이터를 제거합니다. 따라서 데이터 정렬(Sort)과 비교 작업이 필요해 추가적인 리소스를 사용합니다.
  • UNION ALL: 중복 제거를 하지 않으므로, 데이터를 단순히 결합하는 데 사용됩니다.

-- UNION 사용 예제
SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;

-- UNION ALL 사용 예제
SELECT column1 FROM table1
UNION ALL
SELECT column1 FROM table2;
    

2. 성능 비교

UNION은 중복 제거 과정에서 데이터 정렬을 필요로 하기 때문에 처리 시간이 오래 걸립니다. 반면, UNION ALL은 추가적인 처리 과정이 없어 더 빠르게 결과를 반환합니다.

사용 시기

  • 중복된 데이터를 제거해야 할 경우: UNION
  • 중복 제거가 필요 없거나 데이터 처리 속도가 중요한 경우: UNION ALL


UNION ALL 속도 개선 방법

UNION ALL은 기본적으로 빠르지만, 대규모 데이터 처리에서는 여전히 성능 최적화가 필요합니다. 아래는 속도를 개선할 수 있는 몇 가지 팁입니다.

1. 필요한 컬럼만 선택하기

병합 대상 데이터에서 필요한 컬럼만 선택해 데이터 처리량을 최소화합니다.


SELECT column1 FROM table1
UNION ALL
SELECT column1 FROM table2;
    

2. 인덱스 활용

인덱스는 검색 속도를 향상시키는 데 매우 유용합니다. 특히, 병합할 테이블의 주요 컬럼에 인덱스를 설정하면 성능이 크게 향상됩니다.


CREATE INDEX idx_table1_column1 ON table1(column1);
CREATE INDEX idx_table2_column1 ON table2(column1);
    

3. WHERE 조건 추가

필요한 데이터만 미리 필터링하여 병합 대상의 크기를 줄입니다.


SELECT column1 FROM table1 WHERE column2 = '조건1'
UNION ALL
SELECT column1 FROM table2 WHERE column2 = '조건2';
    

4. 병렬 처리 도입

대규모 데이터셋을 처리할 때 데이터베이스의 병렬 처리 기능을 활성화하면 성능이 크게 향상될 수 있습니다.



UNION ALLGROUP BY의 조합

UNION ALL로 결합된 데이터를 그룹화하거나 집계하려면 GROUP BY를 사용할 수 있습니다.


SELECT column1, COUNT(*)
FROM (
    SELECT column1 FROM table1
    UNION ALL
    SELECT column1 FROM table2
) AS subquery
GROUP BY column1;
    

– 위 쿼리는 column1 값별로 데이터의 개수를 집계합니다.

– 서브쿼리를 사용해 데이터를 결합한 후 그룹화 작업을 수행합니다.

활용 사례

  • 복합 데이터 소스에서 특정 항목의 빈도 분석
  • 여러 테이블에서 결합된 데이터를 기준으로 요약 통계 생성


UNION ALL과 조건문 활용

조건문을 활용하면 결합 전에 데이터를 필터링하여 처리량을 줄이고 효율성을 높일 수 있습니다.


SELECT column1 FROM table1 WHERE column2 = 'Active'
UNION ALL
SELECT column1 FROM table2 WHERE column2 = 'Active';
    

팁: 조건 필터링을 먼저 수행

WHERE 조건을 먼저 적용하면 불필요한 데이터를 병합하는 것을 방지할 수 있습니다.



UNION ALLDISTINCT

UNION ALL의 결과에서 중복을 제거하려면 DISTINCT를 사용할 수 있습니다.


SELECT DISTINCT column1
FROM (
    SELECT column1 FROM table1
    UNION ALL
    SELECT column1 FROM table2
) AS subquery;
    

– 이 방식은 중복 제거 과정에서 추가적인 리소스를 소모하므로 성능이 저하될 수 있습니다.

– 중복 제거가 필요하지 않다면 DISTINCT를 피하는 것이 좋습니다