From 1087db952934dc12c08f7ff45080cf2492fb7dd5 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Fri, 24 Jul 2026 17:18:15 +0200 Subject: [PATCH] Check-in history: Avoid JOINs On a test dataset, this was a speedup from 18s to 900ms --- src/pretix/control/views/checkin.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/pretix/control/views/checkin.py b/src/pretix/control/views/checkin.py index 446aad273..e4271a658 100644 --- a/src/pretix/control/views/checkin.py +++ b/src/pretix/control/views/checkin.py @@ -484,10 +484,17 @@ class CheckinListView(EventPermissionRequiredMixin, PaginationMixin, ListView): def get_queryset(self): qs = Checkin.all.filter( - list__event=self.request.event, - ).select_related( - 'position', 'position__order', 'position__item', 'position__variation', 'position__subevent' + list_in=self.request.event.checkin_lists.values_list('id', flat=True), ).prefetch_related( + # For events with huge numbers of check-ins, prefetch_related is a lot more efficient than + # select_related, since it just needs to query one page size of positions instead of joining + # multiple huge tables during result computation + Prefetch( + 'position', + queryset=OrderPosition.all.select_related( + 'order', 'item', 'variation', 'subevent', + ) + ), 'list', 'gate', 'device' ) if self.filter_form.is_valid():