sql 사용법 - UNION과 UNION ALL의 차이점은 무엇입니까?




대체 성능 (19)

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


Answers

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

UNION ALL
UNION ALL 명령은 UNION 명령과 동일하지만 UNION ALL 모든 값을 선택한다는 점만 다릅니다.

UnionUnion all 의 차이점은 Union all Union all 중복 행을 제거하지 않는다는 것입니다. 대신 쿼리 특성에 맞는 모든 테이블의 모든 행을 가져 와서 테이블에 결합합니다.

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


여기서 두 개의 센트를 여기에 추가하기 만하면 UNION 연산자를 순수 SET 중심 UNION으로 이해할 수 있습니다. 예를 들어 집합 A = {2,4,6,8}, 집합 B = {1,2,3, 4}, A 유니온 B = {1,2,3,4,6,8}

세트를 다룰 때, 요소 세트에 있거나 없기 때문에 숫자 2와 4가 두 번 나타나는 것을 원하지 않을 것입니다.

하지만 SQL의 세계에서는 두 세트의 모든 요소를 ​​하나의 "가방"{2,4,6,8,1,2,3,4}에 모두 표시하려고 할 수 있습니다. 이 목적을 위해 T-SQL은 UNION ALL 연산자를 제공합니다.


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


그것이 어떤 데이터베이스에 중요한지 확신하지 못함

UNIONUNION ALL 은 모든 SQL Server에서 작동해야합니다.

불필요한 UNION 피해야합니다. UNION 은 거대한 성능 누수입니다. 사용법을 잘 모르는 경우 엄지 손가락 규칙에 따라 UNION ALL 을 사용하십시오.


UNION과 UNION ALL 모두 두 개의 서로 다른 SQL의 결과를 연결합니다. 그들은 중복을 다루는 방식이 다릅니다.

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

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

주 : 이 명령을 사용하는 동안 선택된 모든 열은 동일한 데이터 유형이어야합니다.

예 : 직원이 2 명이고 고객이 2 명인 경우

  1. 직원 테이블 데이터 :

  1. 고객 테이블 데이터 :

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

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


Teacher & Student 테이블이 두 개인 경우

다이 이름다른 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을 적용 할 수 있습니다. 하지만 이름이나 데이터 유형이 다릅니다.

UNION 연산을 2 개의 테이블에 적용하면 모든 중복 항목 (테이블의 행의 모든 ​​열 값이 다른 테이블과 동일 함)이 무시됩니다. 이처럼

SELECT * FROM Student
UNION
SELECT * FROM Teacher

결과는

UNION ALL 연산을 2 개의 테이블에 적용하면 중복 된 모든 항목을 반환합니다 (2 개의 테이블에있는 행의 열 값간에 차이가있는 경우). 이처럼

SELECT * FROM Student
UNION ALL
SELECT * FROM Teacher

산출

공연:

UNION ALL 성능은 UNION 이 중복 값을 제거하는 추가 작업을 수행 할 때 더 좋습니다. MSSQL 에서 ctrl + L 을 눌러 실행 예상 시간 에서 확인할 수 있습니다.



UNION - 별개의 레코드 결과

동안

UNION ALL - 중복을 포함하여 모든 레코드가 생성됩니다.

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

Union All checkout과 비교하여 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을 사용하면 Execution Plan의 Distinct Sort 작업이 수행됩니다. 이 진술서를 증명하는 증거는 아래와 같습니다.


UNION 은 중복 레코드를 제거합니다 (결과의 모든 열은 동일 함). UNION ALL 은 그렇지 않습니다.

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

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)

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


ORDER BY 가 없다면 UNION ALL 은 행을 되돌릴 수 있지만 UNION 은 전체 결과를 한 번에 보내기 전에 쿼리의 끝까지 기다리게합니다. 이것은 타임 아웃 상황에 차이를 만들 수 있습니다. UNION ALL 은 연결 상태를 그대로 유지합니다.

따라서 시간 초과 문제가 있고 정렬이없고 중복이 문제가되지 않으면 UNION ALL 이 도움이 될 수 있습니다.


내가 추가하고 싶은 한가지 더 -

조합 : 결과 집합은 오름차순으로 정렬됩니다.

조합 모두 : - 결과 집합이 정렬되지 않았습니다. 두 개의 Query 출력이 추가됩니다.


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

중복을 제거하려면 결과 집합을 정렬해야하며 정렬되는 데이터의 양과 다양한 RDBMS 매개 변수의 설정에 따라 UNION의 성능에 영향을 미칠 있습니다 (Oracle PGA_AGGREGATE_TARGET with WORKAREA_SIZE_POLICY=AUTO 또는 WORKAREA_SIZE_POLICY=MANUAL 경우 SORT_AREA_SIZESOR_AREA_RETAINED_SIZE ).

기본적으로 정렬은 메모리에서 수행 할 수있는 경우 더 빠르지 만 데이터 양에 대한 동일한주의 사항이 적용됩니다.

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

첫 번째 게시물에 대해 "성능은별로 좋지 않습니다"라고 말하면서 댓글을 달았지만 그렇게하기에는 평판이 충분하지 않았습니다.


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


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 개 이상의 행을 제공합니다.

우선 순위 관점에서 둘 다 우선 순위가 같습니다.


나는 예제를 추가한다.

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;

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

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

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


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

UNION [전체]

여러 결과 집합을 결합하여 단일 결과 집합으로 반환하도록 지정합니다.

모든

모든 행을 결과에 포함시킵니다. 여기에는 중복 된 내용이 포함됩니다. 지정하지 않으면, 중복 행이 제거됩니다.

DISTINCT 가 결과에 적용된 것과 같은 중복 행을 발견하면 UNION 이 너무 오래 걸립니다.

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) 로 표시됩니다. 중복 된 행이 없을 때이 부작용을 볼 수 있습니다.


많은 사랑을받은 빨간 음영의 Venn 다이어그램을 비판하면서 나는 내 자신의 시도를 게시하는 것이 공평하다고 생각했습니다.

@Martin Smith의 대답은 먼 길의 가장 좋은 것이지만, 그의 테이블은 각 테이블의 키 열을 보여 주지만 이상적으로 키가 아닌 열도 표시되어야한다고 생각합니다.

내가 30 분 내에 할 수있는 최선의 방법은, 여전히 적절하게 키 값이 TableB없거나 null이 OUTER JOIN조인이 아니라 합집합 으로 인해 null이 존재 함을 적절하게 보여 준다고 생각하지 않는다는 것입니다 .





sql union union-all