답변:
UNION
중복 레코드를 제거하고 (결과의 모든 열이 동일한 경우) UNION ALL
그렇지 않습니다.
데이터베이스 서버는 중복 행을 제거하기 위해 추가 작업을 수행해야하지만 일반적으로 중복 보고서 (특히 보고서 개발)를 원하지 않으므로을 UNION
대신 사용하면 성능이 저하됩니다 UNION ALL
.
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
결과:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
결과:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
UNION과 UNION ALL은 서로 다른 두 개의 SQL 결과를 연결합니다. 중복을 처리하는 방식이 다릅니다.
UNION은 결과 집합에서 DISTINCT를 수행하여 중복 된 행을 제거합니다.
UNION ALL은 중복을 제거하지 않으므로 UNION보다 빠릅니다.
노트 : 이 명령을 사용하는 동안 선택한 모든 열의 데이터 형식이 같아야합니다.
예 : 1) 직원과 2) 고객이있는 두 개의 테이블이있는 경우
UNION
중복은 제거하지만 UNION ALL
그렇지는 않습니다.
제거하기 위해 결과 집합을 정렬해야 복제, 이것은에서 수 연합의 성능에 영향을, 데이터의 양에 따라 분류되고, 및 (Oracle의 다양한 RDBMS 매개 변수의 설정 PGA_AGGREGATE_TARGET
에 WORKAREA_SIZE_POLICY=AUTO
나 SORT_AREA_SIZE
와 SOR_AREA_RETAINED_SIZE
있는 경우 WORKAREA_SIZE_POLICY=MANUAL
).
기본적으로 메모리에서 수행 할 수 있으면 정렬이 더 빠르지 만 데이터 볼륨에 대한 동일한 경고가 적용됩니다.
물론 중복없이 반환 된 데이터가 필요한 경우 데이터 소스에 따라 UNION 을 사용해야합니다 .
나는 "매우 성능이 덜한"의견을 인정하기 위해 첫 번째 게시물에 댓글을 달았지만 그렇게하기에는 명성 (점)이 충분하지 않습니다.
UNION과 UNION ALL의 기본 차이점은 공용체 연산으로 결과 집합에서 중복 된 행이 제거되지만 공용체는 결합 후 모든 행을 반환합니다.
에서 http://zengin.wordpress.com/2007/07/31/union-vs-union-all/
다음과 같이 쿼리를 실행하여 중복을 피하고 UNION DISTINCT (실제로는 UNION과 동일)보다 훨씬 빠르게 실행할 수 있습니다.
SELECT * FROM mytable WHERE a=X UNION ALL SELECT * FROM mytable WHERE b=Y AND a!=X
그 AND a!=X
부분을 주목하십시오 . 이것은 UNION보다 훨씬 빠릅니다.
UNION
- UNION
또한 반면에 당신의 접근 방식은하지 않습니다, 하위 쿼리에 의해 반환되는 중복을 제거합니다.
여기에 토론에 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
.
UNION ALL
T-SQL에서 "제공"하지 않습니다. UNION ALL
ANSI SQL 표준의 일부이며 MS SQL Server에만 국한되지 않습니다.
노동 조합
의 UNION
명령은 많은처럼 두 테이블에서 관련 정보를 선택하는 데 사용됩니다 JOIN
명령. 그러나 UNION
명령을 사용할 때 선택한 모든 열의 데이터 형식이 동일해야합니다. 와UNION
고유 한 값만 선택됩니다.
UNION ALL
의 UNION ALL
명령은 동일 UNION
것을 제외하고, 명령UNION ALL
모든 값 선택 .
의 차이 Union
와는 Union all
즉 Union all
대신 그냥 테이블에 쿼리 특성 및 콤바인을 맞는 모든 테이블에서 모든 행을 끌어 중복 행을 제거하지 않습니다.
UNION
문 효과적으로 않는 SELECT DISTINCT
결과 세트. 반환 된 모든 레코드가 조합에서 고유하다는 것을 알고 있다면 UNION ALL
대신 사용 하면 더 빠른 결과를 얻을 수 있습니다.
어떤 데이터베이스가 중요한지 확실하지 않습니다.
UNION
과 UNION ALL
모든 SQL 서버에서 작동합니다.
불필요한 UNION
성능 유출을 피해야 합니다. UNION ALL
어느 것을 사용 해야할지 확실하지 않은 경우 일반적으로 사용 하십시오.
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을 사용 하면 실행 계획 에서 고유 정렬 작업이 수행됩니다. 이 진술을 증명하는 증거는 다음과 같습니다.
UNION
/ 사용에는 적용되지 않습니다 UNION ALL
).
union
으로 join
s와 일부 불쾌한 조합을 사용하여 결과를 생성 할 수는 case
있지만 쿼리를 읽고 유지하는 것이 거의 불가능하며 내 경험상 성능 도 끔찍합니다. 비교 : select foo.bar from foo union select fizz.buzz from fizz
에select 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
union은 두 테이블에서 고유 값을 선택하는 데 사용되며 union은 테이블에서 중복을 포함하여 모든 값을 선택하는 데 사용됩니다.
()
이 두 번째로 표시되어야합니다. 사실, 두 번째 생각에는 union all
결과가 세트가 아니기 때문에 벤 다이어그램을 사용하여 결과를 그리려고 시도해서는 안됩니다!
(Microsoft SQL Server 온라인 설명서에서)
UNION [모두]
여러 결과 세트가 결합되어 단일 결과 세트로 리턴되도록 지정합니다.
모두
모든 행을 결과에 통합합니다. 중복이 포함됩니다. 지정하지 않으면 중복 행이 제거됩니다.
UNION
DISTINCT
결과에 중복 행 찾기 가 적용되는 데 너무 오래 걸립니다 .
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)
결과에 적용된 것으로 표시됩니다 . 중복 행이 없으면이 부작용을 볼 수 있습니다.
예를 추가합니다.
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
와는 UNION ALL
것입니다 UNION will
반면 생략 중복 레코드가 UNION ALL
중복 레코드가 포함됩니다.
Union
결과 집합은 오름차순으로 정렬되지만 UNION ALL
결과 집합은 정렬되지 않습니다
UNION
DISTINCT
결과 세트에서를 수행하여 중복 행을 제거합니다. 반면에 UNION ALL
중복 제거되지 않습니다 때문에 더 빨리보다 UNION
. *
참고 : 의 성능은 UNION ALL
일반적으로보다 더 나은 것 UNION
때문에, UNION
어떤 중복을 제거하는 추가 작업을 수행하는 서버가 필요합니다. 따라서 복제본이없는 것이 확실하거나 복제본에 문제가없는 경우 UNION ALL
성능상의 이유로 사용하는 것이 좋습니다.
ORDER BY
정렬 된 결과가 보장되지 않습니다. 어쩌면 특정 SQL 공급 업체를 염두에 두어야 할 수도 있습니다 (그렇더라도 오름차순으로 정확히 무엇입니까 ...?).이 질문에는 vendor = specific 태그가 없습니다.
두 명의 선생님 과 학생 이 있다고 가정하자
둘 다 같은 이름을 가진 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 :-결과 집합이 오름차순으로 정렬됩니다.
Union All :-결과 집합이 정렬되지 않습니다. 두 개의 쿼리 출력이 추가됩니다.
UNION
는 결과를 오름차순으로 정렬 하지 않습니다 . 사용하지 않고 결과에 나타나는 순서 order by
는 순수한 우연의 일치입니다. DBMS는 중복을 제거하는 것이 효율적이라고 생각하는 전략을 자유롭게 사용할 수 있습니다. 이것은 정렬 일 수도 있지만 해싱 알고리즘이거나 완전히 다른 것일 수도 있습니다. 전략은 행 수에 따라 변경됩니다. union
것으로 나타납니다 100 개의 행과 분류는 100.000 행이되지 않을 수도 있습니다
ORDER BY
절 을 추가하십시오 .
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
중대한! 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 내에 중복 행이 있기 때문에 결과 집합의 행 수가 줄어 듭니다!
반면에 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 개가 넘는 행을 제공합니다
우선 순위 관점에서 둘 다 동일한 우선 순위를 갖습니다.
이 없으면 ORDER BY
a UNION ALL
는 행을 다시 가져올 수 있지만 a UNION
는 쿼리의 끝까지 기다렸다가 전체 결과 집합을 한 번에 제공합니다. 이로 인해 시간 초과 상황에 차이가 생길 수 있습니다 UNION ALL
. 연결 은 그대로 유지됩니다.
타임 아웃 문제가 있고 정렬이없고 복제본이 문제가되지 않는 경우, UNION ALL
가 아닌 경우 다소 도움이 될 수 있습니다.
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
그렇지 않습니다.
유일한 차이점은 다음과 같습니다.
"UNION"은 중복 행을 제거합니다.
"UNION ALL"은 중복 행을 제거하지 않습니다.