14 вопросов по select_related с технических собеседований
14 вопросов1634 компании353 технологии
Что проверяют на интервью
Как устроена подборка
На странице собраны вопросы по select_related — от проверки базовых принципов до практического применения и архитектурных решений. В подборке чаще встречаются темы: select_related, django, database.
В Django select_related получает одиночные связи через SQL JOIN, а prefetch_related загружает связанные объекты отдельными запросами и связывает их в Python. Оба помогают устранить N+1.
Для одной простой ForeignKey-связи select_related обычно получает данные одним JOIN-запросом, prefetch_related — двумя запросами. Точное число зависит от связей, вложенности и последующего доступа.
select_related загружает одиночные связи SQL JOIN, а prefetch_related делает дополнительные запросы и связывает объекты в Python. Выбирайте только связи, действительно используемые при построении ответа.
prefetch_related может замедлить страницу, если загружает огромные коллекции, которые затем почти не используются. Дополнительные запросы и сборка объектов расходуют сеть, CPU и память.
Лучший первый шаг — снять профиль запросов и найти причину 35 обращений. После этого выборочно применяют select_related или prefetch_related к действительно нужным связям.
Наиболее зрелый первый шаг — снять трассировку, найти запросы и затем настроить выборочную загрузку связей. Число 35 само по себе ещё не объясняет причину задержки.
select_related добавляет JOIN и загружает связанные объекты в одном SQL; prefetch_related выполняет дополнительные запросы и связывает результаты в Python. Оба меняют план загрузки ленивого QuerySet.
prefetch_related может замедлить запрос, если загружает много ненужных связанных объектов: растут объём данных, память и стоимость дополнительного SQL. Особенно заметно это на больших выборках.
JOIN-загрузка получает связанные объекты в одном SQL-запросе, а пакетная загрузка сначала читает родителей, затем связи отдельными запросами и объединяет их в памяти.