Сводные значения для модели Django с десятками миллионов записей - PullRequest
1 голос
/ 27 апреля 2020

У меня есть модель Django, разработанная на PostgreSQL с более чем 20 миллионами записей.

Большой объем данных делает невозможным получение даже простого подсчета всех строк.

from myapp.models import LargeModel

len(LargeModel.objects.all())

Есть ли обходной путь для этого?

1 Ответ

4 голосов
/ 27 апреля 2020

Пожалуйста, не , а , используйте len(..) здесь , поскольку это приведет к загрузке 20 миллионов записей в памяти.

Вы можете получить количество записей с помощью .count() [Django -doc] :

from myapp.models import LargeModel

LargeModel.objects<b>.count()</b>

Этот запрос будет выглядеть так:

SELECT <b>COUNT(*)</b>
FROM myapp_largemodel

Если вы используете len(..) Django, оценит набор запросов, это означает, что он будет выполнять запрос, подобный SELECT * FROM myapp_largemodel. Таким образом, он сначала загрузит ~ 20 миллионов записей в память (если это вообще возможно), а затем вычислит len(..) в этом списке. Но для этого потребуются большие объемы памяти, циклы ЦП и пропускная способность сети. Если вы все равно не планируете что-либо делать с этими записями, это неэффективное использование ресурсов.

или как документация по .count() [Django -doc] говорит:

Вызов count() выполняет SELECT COUNT(*) за сценой, поэтому вы должны всегда использовать count() вместо загрузки всей записи в Python объектов и вызов len() результата (если вам все равно не нужно загружать объекты в память, в этом случае len() будет быстрее).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...