В чем разница между UNION и UNION ALL? - PullRequest
1272 голосов
/ 08 сентября 2008

В чем разница между UNION и UNION ALL?

Ответы [ 24 ]

1571 голосов
/ 08 сентября 2008

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)
259 голосов
/ 14 октября 2012

И UNION, и UNION ALL объединяют результат двух разных SQL. Они отличаются тем, как обрабатывают дубликаты.

  • UNION выполняет DISTINCT для набора результатов, устраняя любые повторяющиеся строки.

  • UNION ALL не удаляет дубликаты, поэтому он работает быстрее, чем UNION.

Примечание: При использовании этой команды все выбранные столбцы должны быть одного типа данных.

Пример: если у нас есть две таблицы: 1) сотрудник и 2) клиент

  1. Данные таблицы сотрудников:

enter image description here

  1. Данные таблицы клиентов:

enter image description here

  1. UNION Пример (удаляет все дубликаты записей):

enter image description here

  1. Пример UNION ALL (он просто объединяет записи, а не удаляет дубликаты, поэтому работает быстрее, чем UNION):

enter image description here

44 голосов
/ 18 сентября 2008

UNION удаляет дубликаты, а UNION ALL - нет.

Чтобы удалить дубликаты, набор результатов должен быть отсортирован, и это может повлиять на производительность UNION в зависимости от объема сортируемых данных и настроек различных параметров СУБД. (Для Oracle PGA_AGGREGATE_TARGET с WORKAREA_SIZE_POLICY=AUTO или SORT_AREA_SIZE и SOR_AREA_RETAINED_SIZE, если WORKAREA_SIZE_POLICY=MANUAL).

По сути, сортировка выполняется быстрее, если она может быть выполнена в памяти, но применяется то же предостережение относительно объема данных.

Конечно, если вам нужны данные, возвращенные без дубликатов, вы должны использовать UNION, в зависимости от источника ваших данных.

Я бы прокомментировал первый пост, чтобы квалифицировать комментарий «гораздо менее эффективный», но у меня недостаточно репутации (баллов) для этого.

28 голосов
/ 08 сентября 2008

В ORACLE: UNION не поддерживает типы столбцов BLOB (или CLOB), UNION ALL поддерживает.

21 голосов
/ 08 сентября 2008

Основное различие между UNION и UNION ALL состоит в том, что операция объединения удаляет дублированные строки из результирующего набора, но объединение всех возвращает все строки после объединения.

от http://zengin.wordpress.com/2007/07/31/union-vs-union-all/

12 голосов
/ 13 августа 2012

Вы можете избежать дубликатов и по-прежнему работать намного быстрее, чем UNION DISTINCT (который фактически совпадает с UNION), выполнив запрос, подобный следующему:

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

Обратите внимание на AND a!=X часть. Это намного быстрее, чем UNION.

11 голосов
/ 06 июня 2013

Просто добавьте два моих цента к обсуждению здесь: можно понять оператор UNION как чистый, SET-ориентированный UNION - например, набор A = {2,4,6,8}, набор B = {1,2,3,4}, A UNION B = {1,2,3,4,6,8}

При работе с наборами не требуется, чтобы числа 2 и 4 появлялись дважды, поскольку элемент равен или не равен в наборе.

Однако в мире SQL вы, возможно, захотите увидеть все элементы из двух наборов вместе в одной «сумке» {2,4,6,8,1,2,3,4}. И для этого T-SQL предлагает оператор UNION ALL.

10 голосов
/ 16 августа 2012

UNION
Команда UNION используется для выбора связанной информации из двух таблиц, как и команда JOIN. Однако при использовании команды UNION все выбранные столбцы должны быть одного типа данных. При UNION выбираются только различные значения.

UNION ALL
Команда UNION ALL равна команде UNION, за исключением того, что UNION ALL выбирает все значения.

Разница между Union и Union all заключается в том, что Union all не удаляет дублирующиеся строки, а просто извлекает все строки из всех таблиц, соответствующих специфике вашего запроса, и объединяет их в таблицу.

Оператор UNION эффективно делает SELECT DISTINCT в наборе результатов. Если вы знаете, что все возвращенные записи являются уникальными для вашего объединения, используйте UNION ALL, это даст более быстрые результаты.

7 голосов
/ 08 сентября 2008

Не уверен, что имеет значение, какая база данных

UNION и UNION ALL должны работать на всех серверах SQL.

Вам следует избегать ненужных UNION s, это огромная утечка производительности. Как правило, используйте UNION ALL, если вы не уверены, какой из них использовать.

6 голосов
/ 21 июня 2016

UNION - приводит к отличным записям

, в то время как

UNION ALL - результаты всех записей, включая дубликаты.

Оба являются операторами блокировки, и поэтому я лично предпочитаю использовать JOINS вместо операторов блокировки (UNION, INTERSECT, UNION ALL и т. Д.) В любое время.

Чтобы проиллюстрировать, почему операция Union работает плохо по сравнению с проверкой Union All, в следующем примере.

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'

enter image description here

Ниже приведены результаты операций UNION ALL и UNION.

enter image description here

Оператор UNION эффективно выполняет SELECT DISTINCT для набора результатов. Если вы знаете, что все возвращенные записи уникальны для вашего объединения, используйте UNION ALL вместо этого, это даст более быстрые результаты.

Использование UNION приводит к выполнению операций Distinct Sort в плане выполнения. Доказательство этого утверждения приведено ниже:

enter image description here

...