python - 终端中 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)
在我看来,这两个查询是相同的,除了::timestamp
Django 查询中的时间戳 () 对话。
如何避免我认为导致查询缓慢的 Django 查询中的时间戳对话?提前感谢您的帮助!
解决方案
使用 django 的 ORM 会产生开销,它将记录转换为对象。它(几乎?)总是比原始 SQL 慢。
如果您只需要数据而不需要Table
模型的实例,则可以直接查询数据库。
推荐阅读
- python - Python 中的尺寸不一致(有时显示 1D,有时显示 3D)
- javascript - 如何实现与 Service Worker 和客户端网页的有效双向通信
- java - @Autowired 字段在 @Component 类中为空
- delphi - RichEdit 文本字体发生奇怪变化
- python - Selenium 在不使用 XPath 的情况下从已经给定的元素中查找近元素
- javascript - 在 React 中显示更新的状态
- c++ - 为什么成员类在 C++ 中首先初始化?
- c++ - 内在:使用 __128 寄存器
- c++ - rcpp 使用第三方库 Kvaser kvmlib
- amazon-web-services - HTTPS:被 Windows 防火墙阻止