From a2e1caabd1def4d43c7d7a0fb367b59d1201d44a Mon Sep 17 00:00:00 2001 From: Klaas van Schelven Date: Wed, 7 Jan 2026 16:16:28 +0100 Subject: [PATCH] Add index for project-based quota checks i.e. the code in check_for_thresholds (when the `qs` filters per project) On SQLite the effect is like so, from: EXPLAIN QUERY PLAN SELECT COUNT(*) AS "__count" FROM "events_event" WHERE ("events_event"."project_id" = 1 AND "events_event"."digested_at" >= '2025-12-07 15:12:24.479666'); QUERY PLAN `--SEARCH events_event USING COVERING INDEX events_even_project_ac6fc7_idx (project_id=?) to EXPLAIN QUERY PLAN SELECT COUNT(*) AS "__count" FROM "events_event" WHERE ("events_event"."project_id" = 1 AND "events_event"."digested_at" >= '2025-12-07 15:12:24.479666'); QUERY PLAN `--SEARCH events_event USING COVERING INDEX events_even_project_625413_idx (project_id=? AND digested_at>?) --- ...26_event_events_even_project_625413_idx.py | 19 +++++++++++++++++++ events/models.py | 1 + 2 files changed, 20 insertions(+) create mode 100644 events/migrations/0026_event_events_even_project_625413_idx.py diff --git a/events/migrations/0026_event_events_even_project_625413_idx.py b/events/migrations/0026_event_events_even_project_625413_idx.py new file mode 100644 index 0000000..21321de --- /dev/null +++ b/events/migrations/0026_event_events_even_project_625413_idx.py @@ -0,0 +1,19 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("events", "0025_fix_never_evict"), + ("issues", "0025_alter_grouping_project_alter_issue_project"), + ("projects", "0016_reset_quota_exceeded_until"), + ] + + operations = [ + migrations.AddIndex( + model_name="event", + index=models.Index( + fields=["project", "digested_at"], name="events_even_project_625413_idx" + ), + ), + ] diff --git a/events/models.py b/events/models.py index 02364fd..2427b19 100644 --- a/events/models.py +++ b/events/models.py @@ -162,6 +162,7 @@ class Event(models.Model): indexes = [ models.Index(fields=["project", "never_evict", "digested_at", "irrelevance_for_retention"]), models.Index(fields=["issue", "digested_at"]), + models.Index(fields=["project", "digested_at"]), # project-wide quota check ] def get_raw_data(self):