Вопрос проверяет понимание производительности SQL-запросов с JOIN по сравнению с вложенными подзапросами и последовательными запросами.
Когда вы выполняете запрос с несколькими JOIN, база данных получает возможность оптимизировать соединение таблиц целиком. Оптимизатор запросов анализирует статистику, индексы и выбирает наиболее эффективный план выполнения — например, вложенные циклы, хеш-соединение или слияние. В случае последовательных отдельных запросов (или вложенных селектов) каждый запрос выполняется отдельно, передавая результаты между собой, что увеличивает накладные расходы на сеть, парсинг и планирование.
Рассмотрим две таблицы: users и orders. Нужно получить пользователей с их заказами.
-- Вариант с JOIN (быстрее)
SELECT u.name, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.active = true;
-- Вариант с вложенным подзапросом (медленнее)
SELECT name,
(SELECT amount FROM orders WHERE user_id = u.id) AS amount
FROM users u
WHERE u.active = true;В первом случае база данных может использовать индекс по user_id в orders и выполнить соединение за один проход. Во втором — подзапрос выполняется для каждой строки users, что может привести к N+1 проблеме.
JOIN используется в большинстве реляционных баз данных (PostgreSQL, MySQL, MSSQL) для эффективного объединения связанных данных. Вложенные подзапросы иногда удобны для читаемости, но их стоит избегать в критичных по производительности местах.
Используйте JOIN вместо вложенных подзапросов или последовательных запросов, когда нужно объединить данные из нескольких таблиц. Это снижает нагрузку на базу данных и ускоряет выполнение, особенно при больших объёмах данных.