UNION ALL и UNION (стоимость удаления дубликатов)
Разберитесь, какую работу по удалению дубликатов выполняет UNION и почему UNION ALL быстрее, если вы знаете, что дубликатов нет
«UNION ALL и UNION (стоимость удаления дубликатов)» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Разница
UNION— объединяет и удаляет дубликатыUNION ALL— объединяет и сохраняет каждую строку
UNION ALL работает быстрее
Удаление дубликатов требует больших затрат (сортировки или хеширования). UNION ALL полностью пропускает этот этап. Если Вы знаете, что дубликатов быть не может, всегда выбирайте UNION ALL.
Пример: когда наборы не пересекаются
Активные и архивные заказы никогда не пересекаются — используйте UNION ALL:
SELECT * FROM active_orders
UNION ALL
SELECT * FROM archived_orders;Пример: когда важны дубликаты
Объединение списка событий заказов, в котором возможны повторяющиеся строки: возможно, Вам действительно нужно посчитать каждое вхождение — используйте UNION ALL.
SELECT order_id FROM email_events
UNION ALL
SELECT order_id FROM push_events;Пример: когда нужно удалить дубликаты
Два списка рассылки, в которых некоторые адреса встречаются в обоих списках: нужно получить одну строку для каждого уникального адреса:
SELECT email FROM list_a
UNION
SELECT email FROM list_b;UNION ALL с разными источниками
Объедините таблицы с показателями в ленту «все отчёты»:
SELECT 'login' AS event, ts, user_id FROM logins
UNION ALL
SELECT 'signup', ts, user_id FROM signups
UNION ALL
SELECT 'purchase', ts, user_id FROM purchases
ORDER BY ts DESC LIMIT 100;Порядок внутри каждого подзапроса
Большинство баз данных игнорируют ORDER BY внутри отдельных подзапросов UNION/UNION ALL, если они не обёрнуты в скобки. Применяйте ORDER BY в конце:
SELECT ... FROM a
UNION ALL
SELECT ... FROM b
ORDER BY ts DESC;LIMIT для каждой стороны
Заключите каждую сторону в скобки, чтобы независимо применить LIMIT:
(SELECT id FROM new_orders ORDER BY created_at DESC LIMIT 10)
UNION ALL
(SELECT id FROM old_orders ORDER BY created_at DESC LIMIT 10);Когда планировщик оптимизирует UNION
Если планировщик может доказать, что две стороны не пересекаются (например, благодаря взаимоисключающим фильтрам WHERE), он может внутренне выполнить UNION как UNION ALL, но не полагайтесь на это. Указывайте намерение явно.
UNION и OR
Для условий с OR, которые не могут эффективно использовать один и тот же индекс, объединение UNION ALL двух запросов с отдельными индексами может работать быстрее:
-- Slow OR (may not use either index):
SELECT * FROM users WHERE city = 'NYC' OR country = 'DE';
-- Sometimes faster:
SELECT * FROM users WHERE city = 'NYC'
UNION
SELECT * FROM users WHERE country = 'DE';Следите за порядком столбцов
Операторы над множествами сопоставляют столбцы по позиции, NOT по имени. SELECT a, b FROM t1 UNION ALL SELECT b, a FROM t2 меняет их смысл местами — будьте внимательны.
Итоги
Для производительности по умолчанию используйте UNION ALL; выбирайте UNION только когда действительно нужно удалить дубликаты.
Быстрая проверка
Когда можно заменить UNION на более быстрый UNION ALL?
Часто задаваемые вопросы
Урок «UNION ALL и UNION (стоимость удаления дубликатов)» бесплатный?
Да — полный текст урока «UNION ALL и UNION (стоимость удаления дубликатов)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «UNION ALL и UNION (стоимость удаления дубликатов)»?
Разберитесь, какую работу по удалению дубликатов выполняет UNION и почему UNION ALL быстрее, если вы знаете, что дубликатов нет Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «UNION ALL и UNION (стоимость удаления дубликатов)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- UNION, INTERSECT, EXCEPT
- UNION ALL и UNION (стоимость удаления дубликатов)
- Выражения CASE и сводные запросы
- Шаблоны перекрёстных таблиц (PostgreSQL crosstab())