我用的是django,运行的是一个拥有210万条记录的postgresql数据库。我有一个复杂的查询,它需要20秒才能运行,这需要很长时间,因为在查询中有一个aggregatecount()
函数,它最终会计算150万条记录。我的申请不接受等20秒。
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,但这是解决许多性能相关问题的方法