【发布时间】:2020-04-27 18:52:05
【问题描述】:
我有一个在 PostgreSQL 上开发的 Django 模型,有超过 2000 万条记录。
大量的数据使得甚至无法获得所有行的简单计数。
from myapp.models import LargeModel
len(LargeModel.objects.all())
有什么解决方法吗?
【问题讨论】:
标签: python django postgresql django-models
我有一个在 PostgreSQL 上开发的 Django 模型,有超过 2000 万条记录。
大量的数据使得甚至无法获得所有行的简单计数。
from myapp.models import LargeModel
len(LargeModel.objects.all())
有什么解决方法吗?
【问题讨论】:
标签: python django postgresql django-models
请不要使用len(..)here,因为它会强制加载内存中的 2000 万条记录。
可以通过.count() [Django-doc]获取记录数:
from myapp.models import LargeModel
LargeModel.objects.count()
这将使查询看起来像:
SELECT COUNT(*)
FROM myapp_largemodel
如果您使用len(..),Django 将评估查询集,这意味着它将进行类似SELECT * FROM myapp_largemodel 的查询。因此,它将首先在内存中加载约 2000 万条记录(如果可能的话),然后在该列表上计算 len(..)。但这将因此需要大量内存、CPU 周期和网络带宽。如果你不打算对这些记录做任何事情,那就是资源的低效使用。
或者正如.count() [Django-doc] 上的文档所说:
count()调用在后台执行SELECT COUNT(*),因此您应该始终使用count(),而不是将所有记录加载到 Python 对象中并在结果上调用len()(除非您无论如何都需要将对象加载到内存中,在这种情况下len()会更快)。
【讨论】: