Оптимізація N+1 запитів в ORM
Знаходимо і усуваємо приховані зайві запити до бази даних у типових ORM.

Оптимізація N+1 запитів в ORM
Як виникає проблема
N+1 запит — класична пастка ORM: спочатку виконується один запит за списком із N записів, а потім для кожного запису окремо, в циклі, підвантажуються пов'язані дані — разом N+1 запитів замість одного або двох. У коді це часто виглядає невинно й непомітно при розробці на невеликому наборі тестових даних, а в продакшені з тисячами записів перетворюється на секунди затримки. Детальніше про суміжний підхід можна прочитати в матеріалі «Транзакції та рівні ізоляції в SQL».

Рішення через eager loading
Більшість ORM надають механізм жадібного завантаження пов'язаних даних одним додатковим запитом замість N. Наприклад, у Django це select_related для зв'язків «один до одного» та prefetch_related для «один до багатьох», у Sequelize — параметр include, у SQLAlchemy — joinedload або selectinload.
# Погано: N+1 запитів
posts = Post.objects.all()
for post in posts:
print(post.author.name)
# Добре: 2 запити замість N+1
posts = Post.objects.select_related('author').all()
Виявити проблему в реальному проєкті допомагає логування SQL-запитів у режимі розробки або спеціалізовані інструменти на кшталт Django Debug Toolbar, які прямо показують кількість і повторюваність запитів на сторінці. Ці ідеї перегукуються з темами «Проєктування схеми бази даних: нормалізація і денормалізація» та «Тестування продуктивності: інструменти та метрики».
Схожі матеріали
ACID vs BASE: різні моделі узгодженості
Розбираємо «aCID vs BASE: різні моделі узгодженості» на практичних прикладах і типових помилках при роботі з даними.
Блокування в PostgreSQL: deadlock і як їх уникнути
Розбираємо «блокування в PostgreSQL: deadlock і як їх уникнути» на практичних прикладах і типових помилках при роботі з даними.
CAP-теорема простими словами
Розбираємо «cAP-теорема простими словами» на практичних прикладах і типових помилках при роботі з даними.