Найти в Дзене

📌 Шпаргалка: UNION против UNION ALL. Одно слово, которое может «уронить» базу

Ещё больше полезных шпаргалок, разборов SQL-задач и хитростей, которые спрашивают на собеседованиях, я публикую в своем Telegram-канале. Залетайте, чтобы не ронять продовые базы: 👉 https://t.me/gdejoin YouTube - https://www.youtube.com/@GdeJOIN
Когда нам нужно приклеить одну таблицу к другой сбоку (например, к сотруднику приклеить его отдел), мы используем старый добрый JOIN. А вот когда нужно приклеить одну таблицу снизу (просто докинуть новые строки к старым), мы берем UNION. Казалось бы, всё просто, как дважды два: SELECT name FROM customers
UNION
SELECT name FROM suppliers; Перевод: «Дай мне имена всех клиентов и снизу припиши имена всех поставщиков». Но тут есть подвох. В SQL есть два способа сделать это: UNION и UNION ALL. И разница между ними всего в три буквы, но цена ошибки — зависший отчет или «упавший» сервер. 📉 Давайте разберем, в чем соль. Когда вы пишете просто UNION, SQL-сервер не просто берет и склеивает две таблицы. Он начинает «умничать» и делать скрытую работу: И
Оглавление


Ещё больше полезных шпаргалок, разборов SQL-задач и хитростей, которые спрашивают на собеседованиях, я публикую в своем Telegram-канале. Залетайте, чтобы не ронять продовые базы: 👉 https://t.me/gdejoin

YouTube - https://www.youtube.com/@GdeJOIN

Когда нам нужно приклеить одну таблицу к другой
сбоку (например, к сотруднику приклеить его отдел), мы используем старый добрый JOIN. А вот когда нужно приклеить одну таблицу снизу (просто докинуть новые строки к старым), мы берем UNION.

Казалось бы, всё просто, как дважды два:

SELECT name FROM customers
UNION
SELECT name FROM suppliers;

Перевод: «Дай мне имена всех клиентов и снизу припиши имена всех поставщиков».

Но тут есть подвох. В SQL есть два способа сделать это: UNION и UNION ALL. И разница между ними всего в три буквы, но цена ошибки — зависший отчет или «упавший» сервер. 📉

Давайте разберем, в чем соль.

🔹 UNION (Умный, но медленный перфекционист)

Когда вы пишете просто UNION, SQL-сервер не просто берет и склеивает две таблицы. Он начинает «умничать» и делать скрытую работу:

  1. Собирает всё в одну кучу.
  2. Сортирует данные (чаще всего), чтобы найти одинаковые строки.
  3. Удаляет дубликаты (если «Вася» есть и в клиентах, и в поставщиках — в итоге останется только один «Вася»).

Итог: Вы получаете чистый, уникальный список. Красиво? Да. Цена: Нагрузка на процессор и память. Если строк миллионы, сервер потратит кучу времени на сортировку и поиск повторов.

🔹 UNION ALL (Глупый, но быстрый трудяга)

А вот UNION ALL — парень простой. Он вообще не думает. Он просто берет строки из второго запроса и кидает их под строки первого. Всё.

  1. Дубликаты? Оставляет как есть.
  2. Сортировка? Не делает.
  3. Скорость? Моментальная. 🚀

🍎 Пример на пальцах

Представьте, что у нас есть два списка чисел:

  • Таблица А: 1, 2, 3
  • Таблица Б: 2, 3, 4

Вот что вернут разные команды:

1. UNION (Убрал повторы):

Результат: 1, 2, 3, 4 (Всего 4 строки. Чисто, аккуратно).

2. UNION ALL (Оставил всё):

Результат: 1, 2, 3, 2, 3, 4 (Всего 6 строк. Зато мгновенно!)

⚠️ Золотое правило оптимизации

Запомните одну вещь, которая спасет вам немало нервных клеток:

Всегда пишите UNION ALL по умолчанию.

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

В 90% случаев (например, когда мы собираем логи за январь и за февраль) мы и так знаем, что данные не пересекаются. Зачем заставлять базу искать дубликаты там, где их нет? Лишняя сортировка на миллионах строк может повесить отчет на полчаса.

👇 А вы знали, что обычный UNION под капотом делает тяжелую сортировку, или всегда использовали его «на автомате»?