具有数千万条记录的Django模型的汇总值

问题描述 投票:1回答:1

我有一个在PostgreSQL上开发的Django模型,记录超过2000万。

大量的数据使得不可能仅获得所有行的简单计数。

from myapp.models import LargeModel

len(LargeModel.objects.all())

是否有任何解决方法?

python django postgresql django-models
1个回答
2
投票

[请使用len(..) 此处,因为这将强制删除内存中的2000万条记录。

您可以通过.count() [Django-doc]获得记录数:

.count()

这将使查询看起来像:

from myapp.models import LargeModel

LargeModel.objects.count()

如果使用SELECT COUNT(*) FROM myapp_largemodel,则Django将evaluate查询集,这意味着它将进行类似len(..)的查询。因此,它将首先在内存中延迟大约2000万条记录(如果可能的话),然后在该列表上计算SELECT * FROM myapp_largemodel。但是,这将需要大量的内存,CPU周期和网络带宽。如果您仍然不打算对这些记录做任何事情,那就是资源利用效率低下。

或如len(..)上的文档所述:

.count() [Django-doc]调用在幕后执行.count(),因此您应该始终使用count()而不是加载所有记录到Python对象中并在结果上调用SELECT COUNT(*)(除非您需要仍然将对象加载到内存中,在这种情况下,count()会更快)。

© www.soinside.com 2019 - 2024. All rights reserved.