Index memory_completions(event_id, completed_at) for delete reconcile

The account-deletion reconcile in account.ts uses a correlated subquery
to pick the latest-per-event row from memory_completions. Without an
index whose leading column is event_id the inner subquery falls back to
scanning sqlite_autoindex_memory_completions_1, making the reconcile
O(rows^2) — observed cost in production was ~171k rows read for one
deletion against ~407 rows. With this covering index the inner becomes
a seek and the reconcile drops to ~rows*log(rows).
This commit is contained in:
Christian Semmler 2026-05-05 16:06:07 -07:00
parent 37a36e287b
commit 8205f56a76
No known key found for this signature in database
GPG Key ID: 086DAA1360BEEE5C

View File

@ -0,0 +1,7 @@
-- Index on (event_id, completed_at DESC) for memory_completions.
-- Speeds up the per-event "latest row" lookup used by the account-deletion
-- reconcile in account.ts (the correlated subquery in
-- INSERT INTO memory_events ... SELECT ... WHERE id = (SELECT id FROM mc2 ...)).
-- Without this index that subquery is O(rows^2); with it, O(rows * log rows).
CREATE INDEX IF NOT EXISTS idx_memory_completions_event_completed
ON memory_completions(event_id, completed_at DESC);