我正在使用 django,我正在运行一个包含 210 万条记录的 postgresql 数据库。我有一个复杂的查询,它需要 20 秒才能运行,它需要这么长时间,因为在查询中有一个聚合 count()
函数,它最终统计了 150 万条记录。必须等待 20 秒对于我的应用程序来说是 Not Acceptable 。
django ORM“查询”如下:
WebRequest.objects.values('FormUrl', 'Request__Platform','Request__Ip').annotate(total=Count('Request__Ip')).order_by('-total')[:10]
我尝试使用表索引,但这几乎没有减少延迟。
现在我正在考虑将数据保存在一个表中,并让 pgadmin/cronjob/task scheduler 每小时重新生成一次表,例如
drop table if exists <table> tbl; select into <tabel> tbl from query;
我确实觉得这是一个草率的修复,并且假设必须有更好的方法来减少时间。
有没有更好的方法或者你们认为这是一个可以接受的解决方案?
最佳答案
如果您不需要精确计数,您可以尝试使用 postgresql 统计信息而不是进行计数。在这里查看更详细的解释 https://wiki.postgresql.org/wiki/Count_estimate
这需要使用原始查询而不是 ORM,但这是解决很多性能相关问题的方法
关于django - 如何提高这个 django ORM 查询的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40848145/