Порядок применения фильтров и соединений в SQL‑запросе и возникновение декартового произведения

Логически FROM/JOIN формирует строки до WHERE, но физически оптимизатор вправе протолкнуть фильтр к чтению table1. В приведённом INNER JOIN декартово произведение не требуется.

Короткий ответ

Что ответить на собеседовании

Логически FROM/JOIN формирует строки до WHERE, но физически оптимизатор вправе протолкнуть фильтр к чтению table1. В приведённом INNER JOIN декартово произведение не требуется.

Подробный разбор

Ответ с пояснениями

Условие

В запросе к базе данных применяется оператор JOIN для объединения таблиц table1 и table2, а также условие WHERE для отбора нужных записей.

  1. Какой этап происходит первым: применение условия WHERE или выполнение соединения JOIN?
  2. По какой причине при использовании JOIN может получаться декартово произведение, когда каждая строка первой таблицы соединяется со всеми строками второй?
  3. Какие приёмы позволяют предотвратить появление декартового произведения при объединении таблиц?
SELECT * FROM table1 AS t1
JOIN table2 AS t2 ON t1.id = t2.key_id
WHERE t1.id > 100;

Ответ

Логически FROM/JOIN формирует строки до WHERE, но физически оптимизатор вправе протолкнуть фильтр к чтению table1. В приведённом INNER JOIN декартово произведение не требуется.

CROSS JOIN или соединение без корректного ограничения совпадений возвращает сочетания строк; также множество совпадений может возникнуть при неуникальных ключах с обеих сторон. Это не обязательно ошибка: связь many-to-many действительно размножает пары. Используйте подходящий ON, уникальные ограничения там, где они верны по модели, и проверяйте план через EXPLAIN. Перестановка условий ON/WHERE у INNER JOIN часто эквивалентна, но у OUTER JOIN может менять результат.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее