UNION과 UNION ALL의 차이점은 무엇입니까?


답변:


1734

UNION중복 레코드를 제거하고 (결과의 모든 열이 동일한 경우) UNION ALL그렇지 않습니다.

데이터베이스 서버는 중복 행을 제거하기 위해 추가 작업을 수행해야하지만 일반적으로 중복 보고서 (특히 보고서 개발)를 원하지 않으므로을 UNION대신 사용하면 성능이 저하됩니다 UNION ALL.

UNION 예 :

SELECT 'foo' AS bar UNION SELECT 'foo' AS bar

결과:

+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)

UNION ALL 예 :

SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar

결과:

+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)

179
이것의 의미는 노조가 중복 된 결과를 스캔해야하기 때문에 성능이 훨씬 떨어진다는 것입니다.
Matthew Watson

19
UNION ALL은 특히 고유 한 유형이 없기 때문에 실제로 성능이 향상됩니다. 내 일반적인 관행은 특별히 복제본을 원하지 않는 한 UNION ALL을 사용하는 것입니다.
Adam Caviness

6
여기에 많은 좋은 의견 / 답변이 있음을 알았으므로 위키 플래그를 켜고 성능에 대한 메모를 추가했습니다 ...
Jim Harte

250
인터넷과 같은 네트워크가 병목 상태 인 실제 상황에서는 UNION ALL이 UNION보다 느릴 수 있습니다. 많은 중복 행을 전송하는 비용은 쿼리 실행 시간 이점을 초과 할 수 있습니다. 이는 사례별로 분석해야합니다.
Charles Burns

23
@AdamCaviness 댓글이 이해가되지 않습니다.
kojow7

285

UNION과 UNION ALL은 서로 다른 두 개의 SQL 결과를 연결합니다. 중복을 처리하는 방식이 다릅니다.

  • UNION은 결과 집합에서 DISTINCT를 수행하여 중복 된 행을 제거합니다.

  • UNION ALL은 중복을 제거하지 않으므로 UNION보다 빠릅니다.

노트 : 이 명령을 사용하는 동안 선택한 모든 열의 데이터 형식이 같아야합니다.

예 : 1) 직원과 2) 고객이있는 두 개의 테이블이있는 경우

  1. 직원 테이블 데이터 :

여기에 이미지 설명을 입력하십시오

  1. 고객 테이블 데이터 :

여기에 이미지 설명을 입력하십시오

  1. UNION 예 (모든 중복 레코드를 제거함) :

여기에 이미지 설명을 입력하십시오

  1. UNION ALL 예제 (레코드를 연결하지 않고 중복을 제거하지 않으므로 UNION보다 빠릅니다) :

여기에 이미지 설명을 입력하십시오


3
"선택된 모든 열은 동일한 데이터 유형이어야합니다."-실제로는 엄격하지 않습니다 (관계형 모델 관점에서는 좋지 않습니다!). SQL 표준에 따르면 각 열 설명 자는 이름을 제외하고는 동일해야합니다.
onedaywhen

47

UNION중복은 제거하지만 UNION ALL그렇지는 않습니다.

제거하기 위해 결과 집합을 정렬해야 복제, 이것은에서 연합의 성능에 영향을, 데이터의 양에 따라 분류되고, 및 (Oracle의 다양한 RDBMS 매개 변수의 설정 PGA_AGGREGATE_TARGETWORKAREA_SIZE_POLICY=AUTOSORT_AREA_SIZESOR_AREA_RETAINED_SIZE있는 경우 WORKAREA_SIZE_POLICY=MANUAL).

기본적으로 메모리에서 수행 할 수 있으면 정렬이 더 빠르지 만 데이터 볼륨에 대한 동일한 경고가 적용됩니다.

물론 중복없이 반환 된 데이터가 필요한 경우 데이터 소스에 따라 UNION 을 사용해야합니다 .

나는 "매우 성능이 덜한"의견을 인정하기 위해 첫 번째 게시물에 댓글을 달았지만 그렇게하기에는 명성 (점)이 충분하지 않습니다.


1
"중복 항목을 제거하려면 결과 집합을 정렬해야합니다."-특정 공급 업체를 염두에두고 있지만 질문에 공급 업체별 태그가 없습니다. 있더라도 정렬하지 않고 중복을 제거 할 수 없음을 증명할 수 있습니까?
onedaywhen

2
distinct는 정렬 세트에서 중복을 제거하는 것이 더 빠르기 때문에 결과를 "암시 적으로"정렬합니다. 이것은 반환 된 결과 집합이 실제로 그런 식으로 정렬됨을 의미하지는 않지만 대부분의 경우 고유하고 결과적으로 UNION이 결과 집합을 정렬합니다.
DevilSuichiro

30

ORACLE에서 : UNION은 BLOB (또는 CLOB) 열 유형을 지원하지 않으며 UNION ALL은 지원합니다.



13

다음과 같이 쿼리를 실행하여 중복을 피하고 UNION DISTINCT (실제로는 UNION과 동일)보다 훨씬 빠르게 실행할 수 있습니다.

SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X

AND a!=X부분을 주목하십시오 . 이것은 UNION보다 훨씬 빠릅니다.


4
이것은 행을 생략하므로 NULL 값이 포함 된 경우 예상 결과를 생성하지 못합니다. 또한, 여전히 같은 결과를 반환하지 않습니다 UNION- UNION또한 반면에 당신의 접근 방식은하지 않습니다, 하위 쿼리에 의해 반환되는 중복을 제거합니다.
Frank Schmitt

@FrankSchmitt-이 답변에 감사드립니다. 하위 쿼리에 대한이 조금은 내가 알고 싶었던 것입니다!
Doradus

11

여기에 토론에 2 센트를 추가하기 만하면됩니다. UNION연산자를 순수한 SET 지향 UNION으로 이해할 수 있습니다. 예 : set A = {2,4,6,8}, set B = {1,2,3,4 }, A UNION B = {1,2,3,4,6,8}

세트를 처리 할 때, 숫자 2와 4는 요소 중 하나로서, 두 번 나타나는 원하지 않을 것 입니다 또는 아닙니다 세트로.

그러나 SQL 세계에서는 두 세트의 모든 요소를 ​​하나의 "bag"{2,4,6,8,1,2,3,4}로 함께보고자 할 수 있습니다. 이를 위해 T-SQL은 연산자를 제공합니다 UNION ALL.


2
Nitpick : UNION ALLT-SQL에서 "제공"하지 않습니다. UNION ALLANSI SQL 표준의 일부이며 MS SQL Server에만 국한되지 않습니다.
Frank Schmitt

1
'Nitpick'주석은 TSQL에서 "Union All"을 사용할 수는 없지만 사용할 수 있음을 의미 할 수 있습니다. 물론, 그 의견은 그렇게 말하지 않지만, 그것을 읽는 사람은 그 내용을 유추 할 수 있습니다.
JosephDoggie

10

노동 조합
UNION명령은 많은처럼 두 테이블에서 관련 정보를 선택하는 데 사용됩니다 JOIN명령. 그러나 UNION명령을 사용할 때 선택한 모든 열의 데이터 형식이 동일해야합니다. 와UNION 고유 한 값만 선택됩니다.

UNION ALL
UNION ALL명령은 동일 UNION것을 제외하고, 명령UNION ALL 모든 값 선택 .

의 차이 Union와는 Union allUnion all대신 그냥 테이블에 쿼리 특성 및 콤바인을 맞는 모든 테이블에서 모든 행을 끌어 중복 행을 제거하지 않습니다.

UNION문 효과적으로 않는 SELECT DISTINCT결과 세트. 반환 된 모든 레코드가 조합에서 고유하다는 것을 알고 있다면 UNION ALL대신 사용 하면 더 빠른 결과를 얻을 수 있습니다.


8

어떤 데이터베이스가 중요한지 확실하지 않습니다.

UNIONUNION ALL 모든 SQL 서버에서 작동합니다.

불필요한 UNION성능 유출을 피해야 합니다. UNION ALL어느 것을 사용 해야할지 확실하지 않은 경우 일반적으로 사용 하십시오.


이 질문에는 SQL Server 태그가 없습니다. 중복을 반환하는 옵션은 일반적인 성능이 우수하기 때문에 잘못된 조언이라고 생각합니다.
onedaywhen

1
@oneday OP가 "SQL Servers"라는 구를 모든 RDBMS (예 : MySQL, PostGreSQL, Oracle, SQL Server)의 동의어로 사용했다고 생각합니다. 그래도 문구는 불행하다 (물론, 내가 틀릴 수도있다).
Frank Schmitt

@ FrankSchmitt : 귀하가 나열한 제품 중 어느 것도 진정한 RDBMS가
아닙니다

1
@oneday 정교하게 신경 쓰시겠습니까? 적어도 en.wikipedia.org/wiki/Relational_database_management_system 은 저와 동의하는 것 같습니다. Microsoft SQL Server, Oracle Database 및 MySQL이 명시 적으로 언급되어 있습니다. 아니면 Oracle과 Oracle Database의 차이점에 대해 가장 까다 롭습니까?
Frank Schmitt

8

UNION- 별개의 레코드가 생성

되고

UNION ALL-중복이 포함 된 모든 레코드가 생성됩니다.

둘 다 운영자를 차단하고 있으므로 개인적으로 언제든지 차단 연산자 (UNION, INTERSECT, UNION ALL 등)보다 JOINS를 사용하는 것을 선호합니다.

다음 예에서 Union All 체크 아웃과 비교하여 Union 조작의 성능이 좋지 않은 이유를 설명합니다.

CREATE TABLE #T1 (data VARCHAR(10))

INSERT INTO #T1
SELECT 'abc'
UNION ALL
SELECT 'bcd'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'def'
UNION ALL
SELECT 'efg'


CREATE TABLE #T2 (data VARCHAR(10))

INSERT INTO #T2
SELECT 'abc'
UNION ALL
SELECT 'cde'
UNION ALL
SELECT 'efg'

여기에 이미지 설명을 입력하십시오

다음은 UNION ALL 및 UNION 작업의 결과입니다.

여기에 이미지 설명을 입력하십시오

UNION 문은 결과 집합에서 효과적으로 SELECT DISTINCT를 수행합니다. 반환 된 모든 레코드가 조합에서 고유하다는 것을 알고 있으면 UNION ALL을 대신 사용하면 더 빠른 결과를 얻을 수 있습니다.

UNION을 사용 하면 실행 계획 에서 고유 정렬 작업이 수행됩니다. 이 진술을 증명하는 증거는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


3
이 답변의 모든 내용은 이미 말 했으므로 너무 혼동되어 유용하지 않습니다 (다른 일을 할 때 노조에 대한 조인 제안, 그 의미가 무엇인지 또는 어떤 데이터베이스 서버에 적용되는지 설명하지 않고 "차단"을 이유로 제공함) 또는 매우 오해의 소지가 있습니다 (스크린 샷의 백분율은 실제 UNION/ 사용에는 적용되지 않습니다 UNION ALL).

차단 연산자는 TSQL에서 잘 알려진 연산자입니다. 오퍼레이터를 막는 모든 것은 Joins에 의해 달성 될 수 있지만 그 반대는 아닙니다. Distinct Sort 작업은 그림에서 동그라미로 표시되어 Union이 모든 Union보다 나은 성능을 보여주는 이유와 실행 계획의 존재 위치를 정확하게 보여줍니다. 테이블 T1 및 T2에 더 많은 데이터를 추가하여 백분율로 놀아보십시오!
DBA

기술적 union으로 joins와 일부 불쾌한 조합을 사용하여 결과를 생성 할 수는 case있지만 쿼리를 읽고 유지하는 것이 거의 불가능하며 내 경험상 성능 끔찍합니다. 비교 : select foo.bar from foo union select fizz.buzz from fizzselect case when foo.bar is null then fizz.buzz else foo.bar end from foo join fizz where foo.bar is null or fizz.buzz is null
데빈 Lamothe

@DBA 귀하의 답변은 MS SQL Server 사용자에게만 해당됩니다. 영업 이익은 그들이 사용하고있는 RDBMS를 언급 한 적이 - 그들은 MySQL은, PostgreSQL을, 오라클, SQLite는, ... 사용하고있을 수 있습니다
프랭크 슈미트

6

union은 두 테이블에서 고유 값을 선택하는 데 사용되며 union은 테이블에서 중복을 포함하여 모든 값을 선택하는 데 사용됩니다.


6

벤 다이어그램으로 이해하는 것이 좋습니다.

여기 소스에 대한 링크 가 있습니다. 좋은 설명이 있습니다.

여기에 이미지 설명을 입력하십시오


5
두 번째 그림은 두 사람이 서로 배타적이지 않을 때 상호 배타적이라고 제안합니다. 그림은 첫 번째와 동일하지만 '교차 타원' ()이 두 번째로 표시되어야합니다. 사실, 두 번째 생각에는 union all결과가 세트가 아니기 때문에 벤 다이어그램을 사용하여 결과를 그리려고 시도해서는 안됩니다!
onedaywhen

5

(Microsoft SQL Server 온라인 설명서에서)

UNION [모두]

여러 결과 세트가 결합되어 단일 결과 세트로 리턴되도록 지정합니다.

모두

모든 행을 결과에 통합합니다. 중복이 포함됩니다. 지정하지 않으면 중복 행이 제거됩니다.

UNIONDISTINCT결과에 중복 행 찾기 가 적용되는 데 너무 오래 걸립니다 .

SELECT * FROM Table1
UNION
SELECT * FROM Table2

다음과 같습니다.

SELECT DISTINCT * FROM (
    SELECT * FROM Table1
    UNION ALL
    SELECT * FROM Table2) DT

DISTINCT오버 결과 적용의 부작용 은 결과에 대한 정렬 작업 입니다.

UNION ALL결과는 결과에 임의의 순서 로 표시되지만 UNION결과는 ORDER BY 1, 2, 3, ..., n (n = column number of Tables)결과에 적용된 것으로 표시됩니다 . 중복 행이 없으면이 부작용을 볼 수 있습니다.


5

예를 추가합니다.

UNION 에서는 비교가 필요하기 때문에 별개로 느리게 병합됩니다 (Oracle SQL 개발자의 경우 쿼리를 선택하고 비용 분석을 보려면 F10을 누르십시오).

UNION ALL , 별개없이 합병-> 더 빠릅니다.

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual
UNION ALL
SELECT to_date(sysdate, 'yyyy-mm-dd') FROM dual;

2

UNION 구조적으로 호환되는 두 테이블의 내용을 단일 결합 테이블로 병합합니다.

  • 차:

의 차이 UNION와는 UNION ALL것입니다 UNION will반면 생략 중복 레코드가 UNION ALL중복 레코드가 포함됩니다.

Union결과 집합은 오름차순으로 정렬되지만 UNION ALL결과 집합은 정렬되지 않습니다

UNIONDISTINCT결과 세트에서를 수행하여 중복 행을 제거합니다. 반면에 UNION ALL중복 제거되지 않습니다 때문에 더 빨리보다 UNION. *

참고 : 의 성능은 UNION ALL일반적으로보다 더 나은 것 UNION때문에, UNION어떤 중복을 제거하는 추가 작업을 수행하는 서버가 필요합니다. 따라서 복제본이없는 것이 확실하거나 복제본에 문제가없는 경우 UNION ALL성능상의 이유로 사용하는 것이 좋습니다.


1
"연합 결과 세트가 오름차순으로 정렬 됨"-이 없으면 ORDER BY정렬 된 결과가 보장되지 않습니다. 어쩌면 특정 SQL 공급 업체를 염두에 두어야 할 수도 있습니다 (그렇더라도 오름차순으로 정확히 무엇입니까 ...?).이 질문에는 vendor = specific 태그가 없습니다.
onedaywhen

"이 구조적으로 호환 테이블의 내용을 병합"- 당신이 :) 정말 잘이 부분을 언급했다고 생각
onedaywhen

2

두 명의 선생님학생 이 있다고 가정하자

둘 다 같은 이름을 가진 4 개의 열 이 있습니다

Teacher - ID(int), Name(varchar(50)), Address(varchar(50)), PositionID(varchar(50))

여기에 이미지 설명을 입력하십시오

Student- ID(int), Name(varchar(50)), Email(varchar(50)), PositionID(int)

여기에 이미지 설명을 입력하십시오

동일한 수의 열이있는 두 테이블에 UNION 또는 UNION ALL을 적용 할 수 있습니다. 그러나 이름이나 데이터 형식이 다릅니다.

UNION2 개의 테이블에 작업 을 적용하면 모든 중복 항목이 무시됩니다 (테이블의 행의 모든 ​​열 값은 다른 테이블과 동일 함). 이렇게

SELECT * FROM Student
UNION
SELECT * FROM Teacher

결과는

여기에 이미지 설명을 입력하십시오

UNION ALL2 개의 테이블에 연산 을 적용하면 중복 된 모든 항목을 리턴합니다 (2 개의 테이블에있는 행의 컬럼 값간에 차이가있는 경우). 이렇게

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

산출 여기에 이미지 설명을 입력하십시오

공연:

분명히 UNION ALL 성능은 중복 값을 제거하기 위해 추가 작업을 수행하기 때문에 UNION 보다 낫습니다 . MSSQL 에서 ctrl + L 을 눌러 실행 예상 시간 에서이를 확인할 수 있습니다.


정말? 네 줄의 결과?! 나는 이것이 실제 용어로 절대적인 성능 향상을 얻지 못할 UNION것이기 때문에 의도를 전달하는 데 사용하려는 시나리오라고 생각합니다 (예 : 복제본 없음) UNION ALL.
onedaywhen

2

매우 간단한 단어로 UNION과 UNION ALL의 차이점은 UNION은 중복 레코드를 생략하고 UNION ALL은 중복 레코드를 포함한다는 것입니다.


1

추가하고 싶은 한 가지 더

Union :-결과 집합이 오름차순으로 정렬됩니다.

Union All :-결과 집합이 정렬되지 않습니다. 두 개의 쿼리 출력이 추가됩니다.


진실 ! UNION은 두 가지 하위 결과의 순서를 변경할 수 있습니다.
gracchus

6
이것은 잘못이다. A UNION는 결과를 오름차순으로 정렬 하지 않습니다 . 사용하지 않고 결과에 나타나는 순서 order by는 순수한 우연의 일치입니다. DBMS는 중복을 제거하는 것이 효율적이라고 생각하는 전략을 자유롭게 사용할 수 있습니다. 이것은 정렬 일 수도 있지만 해싱 알고리즘이거나 완전히 다른 것일 수도 있습니다. 전략은 행 수에 따라 변경됩니다. union것으로 나타납니다 100 개의 행과 분류는 100.000 행이되지 않을 수도 있습니다
a_horse_with_no_name

2
조회에 ORDER BY 절이 없으면 RDBMS는 임의의 순서로 행을 리턴 할 수 있습니다 . UNION 작업의 결과 집합이 "오름차순으로"반환된다는 관찰 은 데이터베이스에서 수행 한 "고유 정렬"작업 의 부산물 일뿐 입니다. 관찰 된 동작은 보장 되지 않습니다 . 따라서 그것에 의존하지 마십시오. 사양이 특정 순서로 행을 반환하는 경우 적절한 ORDER BY절 을 추가하십시오 .
spencer7593

1

SQL에서 Union Vs Union ALL의 차이점

Union In SQL이란 무엇입니까?

UNION 연산자는 둘 이상의 데이터 세트의 결과 세트를 결합하는 데 사용됩니다.

Each SELECT statement within UNION must have the same number of columns
The columns must also have similar data types
The columns in each SELECT statement must also be in the same order

예와 연합 대 연합


1

중대한! Oracle과 Mysql의 차이점 : t1 t2는 그들 사이에 중복 행이 없지만 개별적으로 중복 행이 있다고 가정 해 봅시다. 예 : t1은 2017 년부터 판매하고 t2는 2018 년부터 판매합니다.

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION ALL

SELECT T2.YEAR, T2.PRODUCT FROM T2

ORACLE UNION에서 ALL은 두 테이블에서 모든 행을 페치합니다. MySQL에서도 마찬가지입니다.

하나:

SELECT T1.YEAR, T1.PRODUCT FROM T1

UNION

SELECT T2.YEAR, T2.PRODUCT FROM T2

에서 ORACLE T1과 T2 사이에 중복 된 값이 없기 때문에, UNION은 두 테이블의 모든 행을 가져옵니다. 반면에 MySQL 에서는 테이블 t1과 테이블 t2 내에 중복 행이 있기 때문에 결과 집합의 행 수가 줄어 듭니다!


0

반면에 UNION은 중복 레코드를 제거합니다. UNION ALL은 그렇지 않습니다. 그러나 처리 될 대량의 데이터를 확인해야하며 열과 데이터 유형이 같아야합니다.

통합은 내부적으로 "고유 한"동작을 사용하여 행을 선택하므로 시간과 성능 측면에서 비용이 많이 듭니다. 처럼

select project_id from t_project
union
select project_id from t_project_contact  

이것은 나에게 2020 레코드를 제공

반면에

select project_id from t_project
union all
select project_id from t_project_contact

17402 개가 넘는 행을 제공합니다

우선 순위 관점에서 둘 다 동일한 우선 순위를 갖습니다.


0

이 없으면 ORDER BYa UNION ALL는 행을 다시 가져올 수 있지만 a UNION는 쿼리의 끝까지 기다렸다가 전체 결과 집합을 한 번에 제공합니다. 이로 인해 시간 초과 상황에 차이가 생길 수 있습니다 UNION ALL. 연결 은 그대로 유지됩니다.

타임 아웃 문제가 있고 정렬이없고 복제본이 문제가되지 않는 경우, UNION ALL 가 아닌 경우 다소 도움이 될 수 있습니다.


그러나 첫 번째 결과 덩어리는 여러 번 중복 된 한 행일 수 있습니다. 얼마나 유용한가요?!
onedaywhen

0

UNION과 UNION ALL은 둘 이상의 쿼리 결과를 결합하는 데 사용됩니다.

UNION 명령은 두 개의 테이블에서 고유 한 관련 정보를 선택하여 중복 행을 제거합니다.

반면에 UNION ALL 명령은 두 테이블 모두에서 모든 행을 표시하는 모든 값을 선택합니다.


0

습관으로 항상 UNION ALL을 사용하십시오 . 매우 지저분 할 수있는 중복을 제거해야하는 특별한 경우에는 UNION 만 사용하고 여기에있는 다른 주석에서 모든 내용을 읽을 수 있습니다.


0

UNION ALL더 많은 데이터 형식에서도 작동합니다. 예를 들어 공간 데이터 유형을 통합하려고 할 때. 예를 들면 다음과 같습니다.

select a.SHAPE from tableA a
union
select b.SHAPE from tableB b

던질 것이다

The data type geometry cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.

그러나 union all그렇지 않습니다.


-1

유일한 차이점은 다음과 같습니다.

"UNION"은 중복 행을 제거합니다.

"UNION ALL"은 중복 행을 제거하지 않습니다.


13
이것이 허용되는 답변과 비교하여 어떤 가치를 추가합니까?
Nick

@Nick 더 짧은 답변입니다.
Mostafa Vatanpour

이 데이터를 얻기 위해 허용되는 답변의 상당 부분을 읽어야하는 경우 더 짧을 수 있습니다. 그러나이 경우 허용 된 답변에는 첫 번째 문장 에이 모든 정보 포함되어 있으며 그 이후에 차이점의 의미에 대해 자세히 논의합니다.
dmckee --- 전 운영자 고양이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.