Основное различие между UNION
и UNION ALL
заключается в обработке дубликатов строк и производительности операций. Рассмотрим детально оба оператора.
SELECT ProductID, ProductName FROM CurrentProducts
UNION
SELECT ProductID, ProductName FROM DiscontinuedProducts
DISTINCT
на объединенном результатеSELECT ProductID, ProductName FROM CurrentProducts
UNION ALL
SELECT ProductID, ProductName FROM DiscontinuedProducts
Критерий | UNION | UNION ALL |
---|---|---|
Скорость | Медленнее | Быстрее |
Ресурсы CPU | Выше | Ниже |
Память | Больше | Меньше |
Сортировка | Требуется | Не требуется |
Пример разницы в плане выполнения:
-- UNION (видно оператор Sort/Distinct)
|--Sort(DISTINCT ORDER BY([ProductID]))
|--Concatenation
-- UNION ALL (простое объединение)
|--Concatenation
Оба оператора требуют:
Пример с ошибкой:
-- Не сработает (разное число столбцов)
SELECT ProductID, ProductName FROM Products
UNION
SELECT ProductID FROM DiscontinuedProducts
-- Сортировка применяется ко всему результату
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2
ORDER BY Column1
-- UNION ALL сработает быстрее
SELECT COUNT(*) FROM (
SELECT ProductID FROM CurrentProducts
UNION ALL
SELECT ProductID FROM DiscontinuedProducts
) t
-- Можно использовать OPTION для управления планом
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2
OPTION (MERGE UNION)
UNION ALL
по умолчанию, если не нужна дедупликацияUNION
убедитесь, что столбцы имеют подходящие для сравнения типыРезюмируем: UNION ALL
всегда предпочтительнее для производительности, если сохранение дубликатов допустимо. UNION
следует использовать только когда необходимо исключить дублирующиеся строки, понимая накладные расходы на выполнение этой операции. Выбор между ними должен быть осознанным решением, основанным на требованиях к данным и производительности.