我有一个在PostgreSQL上开发的Django模型,记录超过2000万。
大量的数据使得不可能仅获得所有行的简单计数。
from myapp.models import LargeModel
len(LargeModel.objects.all())
是否有任何解决方法?
[请不使用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()
会更快)。