Django 聚合执行过多的 GROUP BY 子句

发布于 2024-12-13 05:17:43 字数 1048 浏览 3 评论 0原文

我正在 MySQL 上使用 Django ORM 进行非常简单的聚合,它生成一个包含 data 字段的 GROUP BY 子句,该字段非常大,并且速度很慢将查询量降低了 100 倍以上。

这是该模型的简化版本:

class Document(models.Model):
    data = models.TextField()

class Attachment(models.Model):
    document = models.ForeignKey(Document)

我正在运行的查询:

Document.objects.annotate(num_attachments=Count('attachment'))

以及 SQL 输出:

SELECT
  `document_document`.`id`,
  `document_document`.`data`,
  COUNT(`document_attachment`.`id`) AS `num_attachments`
FROM `document_document`
  LEFT OUTER JOIN `document_attachment`
    ON (`document_document`.`id` = `document_attachment`.`document_id`) 
GROUP BY
  `document_document`.`id`,
  `document_document`.`id`,
  `document_document`.`data`
ORDER BY NULL

在数据字段上执行 GROUP BY 是不必要且荒谬的。我可以通过执行 values 查询来阻止此操作:

Document.objects.values('pk').annotate(num_attachments=Count('attachment'))

但是如何获得真实的带注释的文档查询作为结果呢?

I am doing a very simple aggregation using the Django ORM on MySQL, and it is producing a GROUP BY clause that includes the data field, which is very large, and is slowing down the query by over 100-fold.

Here is a simplified version of the model:

class Document(models.Model):
    data = models.TextField()

class Attachment(models.Model):
    document = models.ForeignKey(Document)

And the query I am running:

Document.objects.annotate(num_attachments=Count('attachment'))

And the SQL output:

SELECT
  `document_document`.`id`,
  `document_document`.`data`,
  COUNT(`document_attachment`.`id`) AS `num_attachments`
FROM `document_document`
  LEFT OUTER JOIN `document_attachment`
    ON (`document_document`.`id` = `document_attachment`.`document_id`) 
GROUP BY
  `document_document`.`id`,
  `document_document`.`id`,
  `document_document`.`data`
ORDER BY NULL

Doing GROUP BY on the data field is unnecessary and ridiculous. I can stop this by doing a values query:

Document.objects.values('pk').annotate(num_attachments=Count('attachment'))

But then how do I get a real, annotated Document query as the result?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

天涯沦落人 2024-12-20 05:17:43

Django 核心提交者 Karen Tracy 已确认这实际上是 Django 中的一个错误:

http://groups.google.com/group/django-users/browse_thread/thread/22d4d46c8646b2c4#

Karen Tracy, a Django core committer, has confirmed that this is actually a bug in Django:

http://groups.google.com/group/django-users/browse_thread/thread/22d4d46c8646b2c4#

https://code.djangoproject.com/ticket/17144

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文