xataio/pgstream

Apply tunable session settings during the snapshot index/constraint build phase

Closed

#983 opened on Jul 9, 2026

 (0 comments) (1 reaction) (0 assignees)Go (66 forks)auto 404
enhancementgood first issue

Repository metrics

Stars
 (1,151 stars)
PR merge metrics
 (PR metrics pending)

Description

Problem

During an initial snapshot, pgstream loads table data via COPY and then builds indexes and constraints afterward (the pg_dump post-data section, restored in restoreIndicesAndConstraints at snapshot_pg_dump_restore_generator.go:281, plus the pre-data conflict-target PK/unique constraints at line 259). This deferred index build is often a significant chunk of snapshot time, and it currently runs with the target server's default session settings.

Operators today can only speed it up by configuring the target server (ALTER ROLE … SET, PGOPTIONS, or ?options= on the connection URL). All of those require touching the database/role rather than pgstream config.

We should let pgstream apply index-build tuning itself, scoped to just that phase.

Proposed solution

Prepend a configurable set of SET statements to the index/constraint dump before restoring it. Because the plain-format restore pipes the whole dump to a single psql session (pg_restore.go:80), the settings apply to every CREATE INDEX / ADD CONSTRAINT in that phase and auto-reset when the session ends.

Default settings (all tunable/disable-able):
SET maintenance_work_mem = '4GB'
SET max_parallel_maintenance_workers = 4
SET synchronous_commit = off
SET statement_timeout = 0
SET lock_timeout = 0

Requirements

  • Configurable list of session settings applied only to the index/constraint restore.
  • Empty/unset config means current behaviour unchanged.
  • Data COPY phase and steady-state CDC are unaffected.
  • Unit test asserting the settings are prepended to the dump; test asserting the WAL-restore path ignores them.

Contributor guide