gpt4 book ai didi

python - Django QuerySet 与原始 SQL 性能注意事项

转载 作者:行者123 更新时间:2023-11-28 20:03:01 25 4
gpt4 key购买 nike

我正在学习 Django 及其 ORM 数据访问方法,有一些我很好奇的东西。在一个特定的端点中,我进行了一些数据库调用(对 Postgres)——下面是一个例子:

projects = Project.objects\
.filter(Q(first_appointment_scheduled=True) | (Q(active=True) & Q(phase=ProjectPhase.meet.value)))\
.select_related('customer__first_name', 'customer__last_name',
'lead_designer__user__first_name', 'lead_designer__user__last_name')\
.values('id')\
.annotate(project=F('name'),
buyer=Concat(F('customer__first_name'), Value(' '), F('customer__last_name')),
designer=Concat(F('lead_designer__user__first_name'), Value(' '), F('lead_designer__user__last_name')),
created=F('created_at'),
meeting=F('first_appointment_date'))\
.order_by('id')[:QUERY_SIZE]

如您所见,这不是一个小查询 - 我正在提取大量特定的相关数据并进行一些字符串操作。我比较关心性能,所以我尽我所能通过使用 select_related()values() 来提高效率,只得到我想要的需要。

我的问题是,从概念上和广义上讲,在什么时候使用参数化 SQL 而不是使用 ORM 编写查询会变得更快(因为 ORM 必须首先“翻译”上面的“困惑” )?我应该在查询复杂度达到什么程度时切换到原始 SQL?

任何见解都会有所帮助。谢谢!

最佳答案

The question I have is, conceptually and in broad terms, at what pointdoes it become faster to just write my queries using parameterized SQLinstead of using the ORM (since the ORM has to first "translate" theabove "mess")?

如果你问的是性能,永远不要。

与实际执行该查询所花费的时间相比,将 ORM 查询转换为 SQL 所花费的时间将非常少。脑细胞无可替代,服务器便宜。

如果您确实有性能问题,首先要看的是模型中的索引。尝试打印出 ORM 生成的每个查询,并在你的 psql 控制台中通过前缀 EXPLAIN ANALYSE 运行它们。

您还可以使用 django-debug-toolbar 来自动执行此操作。事实上,django-debug 工具栏是寻找瓶颈的重要工具。您会惊讶地发现您错过了一个简单的 select_related 的频率,以及这如何导致执行数百个额外的查询。

At what approximate level of query complexity should I switch over toraw SQL?

如果您问的是编码的难易程度,那要视情况而定。

如果使用 ORM 很难编写查询并且不可读,是的,那么使用原始查询就完全没问题了。例如,具有多个聚合、使用公用表表达式、多个连接等的查询有时很难编写为 ORM 查询,在这种情况下,如果您习惯以这种方式编写原始 sql 就很好。

关于python - Django QuerySet 与原始 SQL 性能注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44329757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com