Как работают select_related/prefetch_related или joinedload/selectinload на уровне SQL?

JOIN-загрузка получает связанные объекты в одном 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.

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

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

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

Подробнее