Index the event log's resubmit count with deleted_at (closes #325)
check / check (push) Successful in 3m21s
check / check (push) Successful in 3m21s
The resubmit count matches resubmitted_from_id against a page of event ids, and GORM adds deleted_at IS NULL. With no statistics, SQLite preferred the deleted_at index once the page held five or more ids, so every event log page read every live event. deleted_at now joins resubmitted_from_id in idx_events_resubmitted_from_id, as for the other event-tier indexes, and the plan test checks the statement with a full page of ids. Model: opus-5-5
This commit is contained in:
@@ -1876,6 +1876,7 @@ tags, so `AutoMigrate` creates them on a fresh database:
|
||||
| `deliveries` | `event_id`, `deleted_at` | The event log, which loads each event's deliveries, and retention, which counts and deletes the deliveries of expired events |
|
||||
| `delivery_results` | `delivery_id`, `deleted_at` | The event log, which loads the attempts of a page's deliveries, and retention, which deletes the attempts of expired events |
|
||||
| `events` | `deleted_at`, `created_at` | The webhook page's statistics, which count recent events |
|
||||
| `events` | `resubmitted_from_id`, `deleted_at` | The event log, which counts the events resubmitted from each event on a page |
|
||||
| `events` | `created_at` | Retention, which selects expired events by age |
|
||||
|
||||
GORM's soft delete adds `deleted_at IS NULL` to these queries; retention
|
||||
@@ -1883,9 +1884,9 @@ leaves it out. SQLite keeps no statistics on these tables, and without them it
|
||||
rates the `deleted_at` index, which every live row matches, above an index on
|
||||
a column matched against several values or compared with a range. So every
|
||||
index but the last also covers `deleted_at`. It comes second, so that
|
||||
retention can use the index without it, except in `events`, where the
|
||||
statistics compare `created_at` with a range (`>=`) and SQLite narrows by a
|
||||
range only on the last column it uses.
|
||||
retention can use the index without it, except in the statistics' `events`
|
||||
index, where they compare `created_at` with a range (`>=`) and SQLite narrows
|
||||
by a range only on the last column it uses.
|
||||
|
||||
#### Common Fields
|
||||
|
||||
|
||||
Reference in New Issue
Block a user