Вопрос проверяет, понимает ли кандидат способы ускорения ORM-запросов и уменьшения количества обращений к базе.
ORM предоставляет инструменты вроде select_related, prefetch_related, ленивой и жадной загрузки, кэширования и агрегирующих запросов. Они помогают сократить количество SQL-запросов и ускорить получение данных. Использовать их стоит тогда, когда нужно заранее подгрузить связанные данные или избежать множественных запросов при обходе связей. Выбор механизма зависит от структуры моделей и объёма данных.
ORM-оптимизация нужна, чтобы избежать N+1-проблемы и снизить нагрузку на базу.
Используется, когда нужно заранее получить связанные данные.
select_related (для отношений один-к-одному / многие-к-одному)
Присоединяет таблицы через JOIN.
Полезно, если связанных объектов немного.
prefetch_related (для many-to-many и one-to-many)
Делает два запроса и связывает данные на уровне ORM.
Эффективно при больших коллекциях.
Пример (Django ORM):
python
books = Book.objects.select_related("author").prefetch_related("tags")
Данные подгружаются только при обращении к атрибуту.
Хорошо, если связанные данные нужны не всегда.
Опасно N+1-проблемой.
Использование COUNT, SUM, AVG для сокращения объёма данных.
Передача тяжёлой работы в БД.
python
Book.objects.annotate(tag_count=Count("tags"))
Локальное в памяти (например, functools.lru_cache)
Redis / мемкэш для тяжелых запросов.
Создание индексов на полях фильтрации.
Уменьшение времени выполнения сложных запросов.
Когда запрос слишком специфичен или тяжёлый.
Использование правильных ORM-оптимизаций позволяет избежать лишних запросов, повысить производительность и эффективно работать с большими объёмами данных.
Уровень
Рейтинг:
4
Сложность:
7
Навыки
Python
Postgres
Ключевые слова
Подпишись на Python Developer в телеграм