Skip to content

perf: declare fetch partial index inside make_outbox_table#3

Merged
lesnik512 merged 2 commits intomainfrom
refactor/lease-only-delivery
May 7, 2026
Merged

perf: declare fetch partial index inside make_outbox_table#3
lesnik512 merged 2 commits intomainfrom
refactor/lease-only-delivery

Conversation

@lesnik512
Copy link
Copy Markdown
Member

The fetch query's hot branch (WHERE acquired_token IS NULL AND queue = ? AND next_attempt_at <= now()) needs a composite partial index to avoid a sequential scan. Until now this was a recommendation in the README that users had to add to their Alembic migration manually — easy to forget, silently catastrophic for throughput.

Declare the index on the Table itself so Alembic autogenerate brings it up alongside the table:

CREATE INDEX outbox_pending_idx ON outbox (queue, next_attempt_at)
  WHERE acquired_token IS NULL;

Drop the now-redundant standalone indexes:

  • queue (index=True on the column) — covered by the composite.
  • outbox_next_attempt_at_idx — same.

Lease-expired rows fall back to a sequential scan when fetch reclaims them; that's fine because expired leases are rare.

The fetch query's hot branch (`WHERE acquired_token IS NULL AND queue = ?
AND next_attempt_at <= now()`) needs a composite partial index to avoid a
sequential scan. Until now this was a recommendation in the README that
users had to add to their Alembic migration manually — easy to forget,
silently catastrophic for throughput.

Declare the index on the Table itself so Alembic autogenerate brings it
up alongside the table:

    CREATE INDEX outbox_pending_idx ON outbox (queue, next_attempt_at)
      WHERE acquired_token IS NULL;

Drop the now-redundant standalone indexes:
- `queue` (`index=True` on the column) — covered by the composite.
- `outbox_next_attempt_at_idx` — same.

Lease-expired rows fall back to a sequential scan when fetch reclaims
them; that's fine because expired leases are rare.
@lesnik512 lesnik512 self-assigned this May 7, 2026
The partial index is declared inside make_outbox_table and brought up by
Alembic autogenerate — users don't need to know it exists.
@lesnik512 lesnik512 merged commit ea32a37 into main May 7, 2026
3 checks passed
@lesnik512 lesnik512 deleted the refactor/lease-only-delivery branch May 7, 2026 10:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant