Django ORM и cursor что лучше в контексте производительности?

В нашей компании есть большой набор данных и много таблиц в базе данных, и мы разработали бэкенд с помощью Django REST и разместили его в AWS и S3. Теперь проблема в том, что при большом объеме данных требуется слишком много времени на выборку из базы данных при использовании Django ORM. Поэтому мне нужна альтернатива, которая обеспечит эффективное решение за счет более быстрого доступа. Что же использовать в этом случае? ORM/cursor/raw_sql/ или что-то другое?

Cursor может быть быстрее, чем ORM, но использовали ли вы индекс базы данных для вашего большого запроса или использовали select_related или prefetch_related для решения проблемы N+1? Если вы используете PostgreSQL, вы можете увеличить размер shared_buffer и work_mem в postgresql.conf, это конфигурации для оптимизации. Если ваши таблицы почти не меняются, вы можете использовать Materialized Views в PostgreSQL или интегрировать систему кэширования.

На мой взгляд, использование курсора или raw_sql должно быть последним вариантом, потому что вы потеряете все преимущества ORM.

Чем меньше вы работаете с API БД, тем быстрее результат, но в большинстве случаев все зависит от того, как вы работаете с ORM. Во-первых, когда вы говорите, что требуется слишком много времени на выборку, знаете ли вы почему? Это из-за слоя базы данных, слоя ORM, или из-за вашего кода на Python? Потому ли, что база данных нуждается в индексировании, освобождении или каких-либо специальных операциях? Это из-за того, что orm (или ваша реализация и использование его) устанавливает плохие запросы? Это из-за множественных запросов (отсутствие или плохое использование prefetch_related и select_related), вы получаете слишком много данных (большой json/бинарный файл) и можно было бы использовать .defer или .values? Это происходит потому, что вы извлекаете все данные?

В любом случае, я рекомендую всегда делать профилирование, а затем думать о том, что можно оптимизировать. В большинстве случаев простая оптимизация сделает 80% работы.

В любом случае, вы должны посмотреть эту страницу: https://docs.djangoproject.com/en/4.0/topics/db/optimization/

и затем документацию по вашей базе данных для оптимизации.

Вернуться на верх