Skip to content

Commit 6676ed5

Browse files
authored
Dashboard: don't use subquery (#12387)
Django 4.2 added support for slices when prefetching. This results in a better query plan ` Sort (cost=287.47..287.52 rows=18 width=1420)` -> ` Subquery Scan on qualify (cost=73.48..74.02 rows=12 width=1420)`, and also performs better in production ``` # before 6.07 s ± 10.7 ms per loop (mean ± std. dev. of 5 runs, 5 loops each) # after 4.61 s ± 197 ms per loop (mean ± std. dev. of 5 runs, 5 loops each) ```
1 parent 69a341d commit 6676ed5

File tree

1 file changed

+1
-6
lines changed

1 file changed

+1
-6
lines changed

readthedocs/projects/querysets.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@
33
from django.conf import settings
44
from django.db import models
55
from django.db.models import Count
6-
from django.db.models import OuterRef
76
from django.db.models import Prefetch
87
from django.db.models import Q
9-
from django.db.models import Subquery
108

119
from readthedocs.core.permissions import AdminPermission
1210
from readthedocs.core.querysets import NoReprQuerySet
@@ -143,12 +141,9 @@ def prefetch_latest_build(self):
143141
from readthedocs.builds.models import Build
144142

145143
# Prefetch the latest build for each project.
146-
subquery = Subquery(
147-
Build.internal.filter(project=OuterRef("project_id")).order_by("-date").values("pk")[:1]
148-
)
149144
latest_build = Prefetch(
150145
"builds",
151-
Build.objects.filter(pk__in=subquery).select_related("version"),
146+
Build.internal.select_related("version").order_by("-date")[:1],
152147
to_attr=self.model.LATEST_BUILD_CACHE,
153148
)
154149
return self.prefetch_related(latest_build)

0 commit comments

Comments
 (0)