Вынесите фильтрацию в подзапрос или CTE перед JOIN, сохранив нужную семантику. Реальный порядок выполнения всё равно проверяют по плану оптимизатора.
В самом запросе как бы ты реализовал фильтрацию перед джойном?
Вынесите фильтрацию в подзапрос или CTE перед JOIN, сохранив нужную семантику. Реальный порядок выполнения всё равно проверяют по плану оптимизатора.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Вынесите фильтрацию в подзапрос или CTE перед JOIN, сохранив нужную семантику. Реальный порядок выполнения всё равно проверяют по плану оптимизатора.
Например, сохранить всех клиентов и присоединить только оплаченные заказы:
SELECT c.id, o.id AS order_id
FROM clients c
LEFT JOIN (
SELECT id, client_id
FROM orders
WHERE status = 'paid'
) o ON o.client_id = c.id;
Фильтр в ON может дать тот же результат. А перенос его в общий WHERE исключит строки без совпадения. Для INNER JOIN оптимизатор часто сам проталкивает допустимые фильтры, поэтому CTE не гарантирует ускорение.