如何提高这个django ORM查询的性能?

时间:2016-11-28 15:39:03

标签: django performance postgresql

我正在使用django,我正在运行一个拥有210万条记录的postgresql数据库。我有一个复杂的查询,运行需要20秒,并且需要很长时间,因为在查询中有一个聚合Person::loadMultiple($children, Yii::$app->request->post()); 函数,最终计算150万条记录。我的申请不能接受等待20秒。

django ORM“查询”如下:

count()

我尝试使用表索引,但这几乎没有减少延迟。

现在我正在考虑将数据保存在表中,并通过pgadmin / cronjob / task scheduler每小时重新生成一次表,例如。

WebRequest.objects.values('FormUrl', 'Request__Platform','Request__Ip').annotate(total=Count('Request__Ip')).order_by('-total')[:10]

我觉得这是一个草率的修复,并假设必须有一个更好的方法来减少时间。

有没有更好的方法,或者你们认为这是一个可接受的解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果您不需要精确计数,可以尝试使用postgresql统计数据而不是计数。请在此处查看更详细的exaplanation https://wiki.postgresql.org/wiki/Count_estimate

这需要使用原始查询而不是ORM,但这是解决许多与性能相关的问题的方法