From: Magnus Hagander Date: Tue, 17 Aug 2021 10:38:28 +0000 (+0200) Subject: Force timestamp check into join condition X-Git-Url: http://git.postgresql.org/gitweb/static/%7B%7Bpguslink%28?a=commitdiff_plain;h=0277291830a3b74cb184d14815633d6be9646bf5;p=hamn.git Force timestamp check into join condition Unfortunately, 6c44b60 very clearly de-optimized the query when running on a system with millions of log-rows. Oops. So force the django ORM to put the filter on the join clause thereby making it possible to use an index, which should make it actually optimized. --- diff --git a/hamnadmin/hamnadmin/register/views.py b/hamnadmin/hamnadmin/register/views.py index 832f4ae..289535a 100644 --- a/hamnadmin/hamnadmin/register/views.py +++ b/hamnadmin/hamnadmin/register/views.py @@ -3,7 +3,7 @@ from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required, user_passes_test from django.conf import settings from django.db import transaction -from django.db.models import Count, Max, Q, Subquery, OuterRef, Exists +from django.db.models import Count, Max, Q, Subquery, OuterRef, Exists, FilteredRelation from django.contrib import messages from hamnadmin.register.models import Post, Blog, Team, AggregatorLog, AuditEntry @@ -55,8 +55,10 @@ def root(request): blogs = blogs.annotate( has_entries=Exists(Post.objects.filter(feed=OuterRef("pk"), hidden=False)), - recent_failures=Count('aggregatorlog', filter=Q(aggregatorlog__success=False, aggregatorlog__ts__gt=datetime.datetime.now() - datetime.timedelta(days=1))), + recent_failure_entries=FilteredRelation('aggregatorlog', condition=Q(aggregatorlog__success=False, aggregatorlog__ts__gt=datetime.datetime.now() - datetime.timedelta(days=1))), last_was_success=Subquery(AggregatorLog.objects.filter(feed=OuterRef("pk")).values('success')[:1]), + ).annotate( + recent_failures=Count('recent_failure_entries'), ).order_by('archived', 'approved', 'name') return render(request, 'index.html', { @@ -73,7 +75,9 @@ def edit(request, id=None): if id: blogqs = Blog.objects.all().annotate( has_entries=Exists(Post.objects.filter(feed=OuterRef("pk"), hidden=False)), - recent_failures=Count('aggregatorlog', filter=Q(aggregatorlog__success=False, aggregatorlog__ts__gt=datetime.datetime.now() - datetime.timedelta(days=1))), + recent_failure_entries=FilteredRelation('aggregatorlog', condition=Q(aggregatorlog__success=False, aggregatorlog__ts__gt=datetime.datetime.now() - datetime.timedelta(days=1))), + ).annotate( + recent_failures=Count('recent_failure_entries'), ) if request.user.is_superuser: blog = get_object_or_404(blogqs, id=id)