Проблема
При использовании ORM легко не заметить, как один HTTP-запрос начинает выполнять десятки SQL-запросов.
Например:
1 запрос на получение списка заказов;
затем для каждого заказа:
- отдельный запрос за пользователем;
- отдельный запрос за предложением;
- отдельный запрос за очередью.
Такое поведение известно как проблема N+1.
На SQLite и небольшом объеме данных это почти незаметно, но со временем приводит к лишней нагрузке и ухудшению производительности.
Цель
При разработке новых функций обращать внимание на количество SQL-запросов.
По возможности:
- получать связанные данные одним запросом;
- использовать возможности SQLAlchemy (
selectinload, joinedload и т.п.), когда это действительно необходимо;
- избегать повторных одинаковых запросов внутри циклов.
Примечание
Это не задача на преждевременную оптимизацию.
Сначала код должен быть понятным и корректным.
Оптимизация требуется только тогда, когда появляется большое количество однотипных SQL-запросов или становится заметна проблема производительности.
Проблема
При использовании ORM легко не заметить, как один HTTP-запрос начинает выполнять десятки SQL-запросов.
Например:
1 запрос на получение списка заказов;
затем для каждого заказа:
Такое поведение известно как проблема N+1.
На SQLite и небольшом объеме данных это почти незаметно, но со временем приводит к лишней нагрузке и ухудшению производительности.
Цель
При разработке новых функций обращать внимание на количество SQL-запросов.
По возможности:
selectinload,joinedloadи т.п.), когда это действительно необходимо;Примечание
Это не задача на преждевременную оптимизацию.
Сначала код должен быть понятным и корректным.
Оптимизация требуется только тогда, когда появляется большое количество однотипных SQL-запросов или становится заметна проблема производительности.