#28477: Strip unused annotations from count queries
-------------------------------------+-------------------------------------
Reporter: Tom Forbes | Owner: Tom
Type: | Forbes
Cleanup/optimization | Status: assigned
Component: Database layer | Version: master
(models, ORM) |
Severity: Normal | Resolution:
Keywords: | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Reupen Shah):
The behaviour is actually a bit more bizarre than I thought.
With the same person model, here are four count variations and the
generated queries:
1.
{{{
Person.objects.count()
}}}
{{{
SELECT COUNT(*) AS "__count" FROM "people_person"
}}}
2.
{{{
Person.objects.values('pk').count()
}}}
{{{
SELECT COUNT(*) AS "__count" FROM "people_person"
}}}
3.
{{{
Person.objects.annotate(full_name=Concat('first_name', Value(' '),
'last_name')).count()
}}}
{{{
SELECT COUNT(*) FROM (SELECT "people_person"."id" AS Col1,
CONCAT("people_person"."first_name", CONCAT(' ',
"people_person"."last_name")) AS "full_name" FROM "people_person" GROUP BY
"people_person"."id", CONCAT("people_person"."first_name", CONCAT(' ',
"people_person"."last_name"))) subquery
}}}
4.
{{{
Person.objects.annotate(full_name=Concat('first_name', Value(' '),
'last_name')).values('pk').count()
}}}
{{{
SELECT COUNT(*) FROM (SELECT "people_person"."id" AS Col1 FROM
"people_person") subquery
}}}
So there's a simple workaround for the case I gave in my last comment in
calling `.values('pk')` before `.count()`. However, that's not much help
if Django or other libraries are the ones calling `.count()`.
On the plus side, I have a better understanding of what the problem is
from looking at the Django source code.
--
Ticket URL: <https://code.djangoproject.com/ticket/28477#comment:9>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/061.3a64851e336b74aa6e2351e7d22137f9%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.