JOIN-загрузка получает связанные объекты в одном SQL-запросе, а пакетная загрузка сначала читает родителей, затем связи отдельными запросами и объединяет их в памяти.
Как работают select_related/prefetch_related или joinedload/selectinload на уровне SQL?
JOIN-загрузка получает связанные объекты в одном SQL-запросе, а пакетная загрузка сначала читает родителей, затем связи отдельными запросами и объединяет их в памяти.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
JOIN-загрузка получает связанные объекты в одном SQL-запросе, а пакетная загрузка сначала читает родителей, затем связи отдельными запросами и объединяет их в памяти.
В Django select_related использует JOIN для одиночных связей, prefetch_related — отдельные запросы, в том числе для коллекций. В SQLAlchemy похожие подходы представлены joinedload и selectinload.
JOIN коллекций размножает строки родителя, особенно при нескольких независимых связях. Пакетная загрузка избегает такого произведения, но требует дополнительных round trips и может разбивать список ключей на порции. Выбор проверяют по SQL, объёму данных и числу запросов, а не по правилу «один запрос всегда быстрее». Для joined eager loading коллекций SQLAlchemy учитывайте требование unique().
Источник: docs.sqlalchemy.org.