嗨,我有很多从查询中获得的对象,查询集尚未评估,当我将 objectlist 传递给分页器对象时,返回分页器对象需要 14 秒,这是因为它正在评估列表中的所有对象,这需要时间(打分贝可能是)。
在将查询集发送到分页器对象之前,我强行评估了它:
ds_objects = list(ds_objects)
猜猜现在分页在返回对象中花费了 0.0 秒,但现在问题仍然存在,所有时间都由 ds_objects = list(ds_objects) 占用,我该如何有效地做到这一点,以便我的 View 响应时间减少到 2 或 3 秒?我还没有找到任何最佳解决方案:s
最佳答案
我的猜测是 JOIN (所以 select_related
)对查询速度并不重要。无论如何,当你做一个 values()
查询你真的不需要 select_related
因为您将获得的唯一字段是指定为 values()
的字段参数,它们无论如何都由 JOIN 检索。
要了解为什么需要这么长时间,您可以执行以下操作:
打印出“原始 sql”
print tbl_action_log.objects.order_by('-TicketID', '-ActionLogID').query
修改它(它实际上不是 SQL,但它应该足够接近)以在 SQL 客户端中运行,例如 django 自己的
manage.py dbshell
.执行它,注意时间。然后执行
EXPLAIN ...
(将您的查询放在点中),您可能会看到一些“全表扫描”消息在受影响的列上向数据库表添加适当的索引,然后再次执行查询。索引可能是这样的:
CREATE INDEX idx_action_log_on_tkid_logid ON tbl_action_log (TicketID, ActionLogID);
当您对索引感到满意时,将其创建命令存储在
文件
app/sql/modelname.sql
,这将在任何新部署中创建索引。
关于Django 查看响应时间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7008249/