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

标签 django performance postgresql

我正在使用 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/

相关文章:

python - 是否可以在 Django 管理中限制在另一个模型上定义关系的模型的过滤器 ManyToMany/Foreign Key?

django rest API 路由显示所有端点的相同 api 链接

performance - 多次渲染同一个模型

java - 出于语法原因,是否值得使用长度为 2 的数组而不是两个变量?

sql - 我有一个相当大的表,需要获取行 `where column_a <> column_b` ,我需要什么样的索引?

postgresql - 在 Heroku 上与 Go + Postgres 的连接被拒绝

python - Django:如何在包含模板标签中正确传递URL?

python - 使用 scrapy : defining path to Django project 访问 Django 模型

performance - sbt 高 CPU 使用率与 ~run

postgresql - 在RUST中将Postgresql时间戳转换为字符串