Iterates engine.storage_health and dispatches merge/repack for every table whose recommended_action != 'ok'
-- Dry run: show what would be doneCALLengine.storage_maintenance_auto(dry_run=>true);-- Execute maintenance for colcompress tables onlyCALLengine.storage_maintenance_auto(am_filter=>'colcompress',p_verbose=>true);-- Via pg_cron (runs every 5 minutes)SELECTcron.schedule('storage-maintenance','*/5 * * * *',$$CALLengine.storage_maintenance_auto()$$);
Log when VectorGroupAgg falls back to native HashAggregate
storage_engine.planner_debug_level
enum
debug3
Log level for planner diagnostics
Auto-Maintenance Background Worker
Parameter
Type
Default
Description
storage_engine.maintenance_auto_enabled
bool
off
Enable background maintenance worker
storage_engine.maintenance_auto_database
string
''
Database to connect to (empty = disabled)
storage_engine.maintenance_auto_naptime
int
300
Seconds between maintenance runs
Known Limitations
No AFTER ROW triggers / no foreign keys
colcompress and rowcompress do not support AFTER ROW triggers or foreign keys. This means pg_repack cannot be used. Use engine.colcompress_repack() instead:
colcompress_repack acquires AccessExclusiveLock for the duration — schedule during a maintenance window for large tables.
AFTER STATEMENT triggers are supported
Only row-level (FOR EACH ROW) AFTER triggers are blocked. Statement-level (FOR EACH STATEMENT) AFTER triggers work fine.
Stripe pruning disabled in parallel mode
Each parallel worker reads its assigned stripes independently without a global pruning pass. Stripe pruning only applies in the sequential (non-parallel) scan path.
B-tree index on orderby column disables pruning
If a B-tree index exists on the orderby column, the planner prefers the index path over the sequential scan, bypassing stripe pruning. For analytical tables, avoid B-tree indexes on the sort key. Use SET storage_engine.enable_engine_index_scan = on at session level for occasional point lookups instead.
INSERT … SELECT with pre-existing indexes
Index TIDs may be corrupted when tables are populated via INSERT INTO … SELECT with pre-existing indexes. Workaround:
REINDEXTABLECONCURRENTLYmytable;
engine.uint8 Type Reference
Attribute
Value
Type name
engine.uint8
Storage
8 bytes, pass-by-value
Range
[0, 18446744073709551615]
Operators
<, <=, =, <>, >=, > (unsigned semantics)
Opclasses
btree (engine.uint8_ops), hash
Casts
↔ bigint (assignment), → numeric (implicit), ↔ text (assignment)