首页 > 解决方案 > 终端中 Django 查询和原始 sql 查询之间的执行时间差

问题描述

我有一个运行良好的 Django 查询,但执行速度比在终端中进行相同的查询要慢。出于好奇,我在终端中运行了 django 查询(我从 Django Debug Tooltbar 中读取了它),我得到了同样的慢查询。我试图找出可能是什么问题,我怀疑::timestamp转换。

我尝试在下面提出我的问题:

我的 Django 查询:

   query=Table.filter(time_stamp__range=('2017-05-28 01:00:00',  '2017-05-28 07:00:00')).values('time_stamp',  'value')

根据 Django 调试工具栏,这等于这个原始 sql 语句:

SELECT * FROM "table" WHERE "table"."time_stamp" BETWEEN '2018-05-28T01:00:00.004325'::timestamp AND '2018-05-28T07:00:00.004325'::timestamp

根据调试工具栏的结果,我得到了1436,11 毫秒的运行时间。

之后,我通过终端登录到我的 PostgreSQl 数据库并使用了以下查询:

select * from table where time_stamp between '2018-05-28 01:00:00' and '2018-05-28 07:00:00';

在这里,我得到了753.086 毫秒的执行时间。

我的模型样本:

class Table(models.Model):
    time_stamp = models.DateTimeField()
    value = models.FloatField(blank=True, null=True)

在我看来,这两个查询是相同的,除了::timestampDjango 查询中的时间戳 () 对话。

如何避免我认为导致查询缓慢的 Django 查询中的时间戳对话?提前感谢您的帮助!

标签: pythondjangopostgresqldjango-querysetdjango-orm

解决方案


使用 django 的 ORM 会产生开销,它将记录转换为对象。它(几乎?)总是比原始 SQL 慢。

如果您只需要数据而不需要Table模型的实例,则可以直接查询数据库


推荐阅读