Ответ
PostgreSQL не имеет строгого встроенного лимита на количество таблиц в запросе. Однако существуют практические ограничения, обусловленные производительностью и ресурсами:
- Сложность планирования запроса: Планировщик PostgreSQL оценивает множество возможных планов выполнения для JOIN. С ростом числа таблиц (N) сложность может возрастать факториально (O(N!)), что приводит к резкому увеличению времени планирования.
- Потребление памяти: Для хранения промежуточных результатов и метаданных запроса требуется память. Большое количество JOIN может исчерпать доступную оперативную память (
work_mem). - Читаемость и поддержка: Запрос с десятками JOIN становится крайне сложным для понимания и отладки.
Практический совет: Запросы с более чем 10-15 JOIN часто являются сигналом к пересмотру структуры. Альтернативы:
- Денормализация данных.
- Разбивка одного сложного запроса на несколько простых с последующей агрегацией на уровне приложения.
- Использование материализованных представлений для предварительного расчета сложных связей.
Пример запроса с несколькими JOIN:
SELECT u.name, o.order_date, p.product_name
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id
WHERE u.active = true;