Skip to content

1 - autovacuum

Autovacuum keeps MVCC tables usable by scheduling background VACUUM and ANALYZE work. It is both a performance mechanism and a wraparound safety net, not optional cosmetic housekeeping.
Note

Fact — official short description: “Starts the autovacuum subprocess.”

Identity

Type , Valuebool
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Valueon
on

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 on on

How it works

When enabled, one launcher coordinates worker processes across databases. Workers use cumulative table-change statistics, so track_counts must also be enabled, and they run VACUUM or ANALYZE when a table crosses the relevant thresholds.

Ordinary vacuum triggers react to inserted, updated, and deleted tuples. Separately, PostgreSQL can launch anti-wraparound autovacuums even when this switch is off, because allowing old transaction IDs or multixact IDs to wrap would threaten correctness.

Most trigger and cost settings can be overridden per table through storage parameters. Temporary tables are outside autovacuum’s reach, and partitioned parent tables can still need manual ANALYZE even though their partitions are processed normally.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Keep it on. Tune busy tables individually, then watch dead tuples, autovacuum duration, canceled workers, and XID age before changing global aggressiveness.
OLAP Keep it on for safety, but coordinate it with bulk-load windows. Run explicit ANALYZE after large loads and on partitioned parents when planner statistics must be immediately current.
Small nodes Leave the default on. Reducing worker count or per-table aggressiveness is safer than disabling the launcher merely to save a small amount of background activity.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 unmodified; OLAP: PG9.0–19 Beta 3 unmodified; CRIT: PG9.0–19 Beta 3 unmodified; TINY: PG9.0–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Turning it off does not disable emergency anti-wraparound vacuuming.
  • track_counts must be on for ordinary autovacuum decisions to work.
  • Long transactions and stale replication slots can prevent cleanup even when workers run successfully.
  • Autovacuum does not analyze partitioned parent tables solely because their partitions changed.
  • Temporary tables require maintenance from the owning session.

autovacuum_max_workers · autovacuum_naptime · autovacuum_vacuum_scale_factor · autovacuum_analyze_scale_factor · autovacuum_freeze_max_age · track_counts

References

2 - autovacuum_analyze_scale_factor

autovacuum_analyze_scale_factor — Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples. Observed in PG9.0–19 Beta 3; its last measured boot default is 0.1 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value0100
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value0.1
0.1

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 0.1 0.1

How it works

Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

The automatic-ANALYZE trigger is autovacuum_analyze_threshold plus autovacuum_analyze_scale_factor times pg_class.reltuples; inserts, updates, and deletes feed the cumulative counter. Per-table storage parameters can override the global values, and the statistics are eventually consistent estimates.

Monitor and change autovacuum_analyze_scale_factor together with autovacuum_analyze_threshold, default_statistics_target, track_counts. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_analyze_scale_factor from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 0.04 different 0.04
OLAP 0.04 different 0.04
CRIT 0.04 different 0.04
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 0.04 (dcs); OLAP: PG9.0–19 Beta 3 = 0.04 (dcs); CRIT: PG9.0–19 Beta 3 = 0.04 (dcs); TINY: PG9.0–19 Beta 3 unmodified. Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to refresh planner statistics earlier on growing production tables; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum_analyze_threshold · default_statistics_target · track_counts · autovacuum · autovacuum_freeze_max_age · autovacuum_max_workers

References

3 - autovacuum_analyze_score_weight

autovacuum_analyze_score_weight — Scaling factor of analyze score for autovacuum prioritization. Observed in PG19 Beta 3; its last measured boot default is 1 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Scaling factor of analyze score for autovacuum prioritization.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value010
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value1
1

Lifecycle

Fact Value
First observed PG19 Beta 3
Present in PG19 Beta 3
Removed in No
Introduction commit d7965d65fc5b — Add rudimentary table prioritization to autovacuum.
Commit date 2026-03-27
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG19 Beta 3 1 1

How it works

PostgreSQL describes autovacuum_analyze_score_weight as follows: “Scaling factor of analyze score for autovacuum prioritization.” A configuration reload applies the value to the server without a full restart. The atlas measures it in PG19 Beta 3; boot_val is the compiled or initialized baseline, not proof of a running cluster’s effective setting.

PostgreSQL 19 scores every eligible table and sorts work by the maximum weighted component. This parameter multiplies the ANALYZE change pressure component: values above 1 raise its scheduling influence, values between 0 and 1 reduce it, and setting every score weight to 0 restores the pre-19 catalog-order strategy. pg_stat_autovacuum_scores exposes the components for inspection.

Read it together with autovacuum_freeze_score_weight, autovacuum_multixact_freeze_score_weight, autovacuum_vacuum_score_weight, autovacuum_vacuum_insert_score_weight. Check SHOW and pg_settings on the target server, verify the source and pending_restart fields, and compare workload, logs, and resource metrics before and after any change.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Start at the upstream default and use pg_stat_autovacuum_scores, table churn, freeze age, queueing, and foreground latency to justify a change. Protect wraparound work and avoid letting a busy-table preference starve quieter tables.
OLAP Batch-heavy systems can benefit from prioritizing the largest maintenance debt or parallelizing index cleanup, but benchmark I/O saturation, maintenance memory, worker contention, and completion time across the whole maintenance window.
Small nodes Keep weights and parallelism conservative. One extra worker can be a large share of CPU, RAM, and storage queue depth; first fix thresholds and ensure autovacuum has enough time to finish.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG19 Beta 3 unmodified; OLAP: PG19 Beta 3 unmodified; CRIT: PG19 Beta 3 unmodified; TINY: PG19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating the measured boot_val for autovacuum_analyze_score_weight as proof of the effective value on an initialized or managed cluster.
  • Applying a change as though it were immediate while pg_settings reports sighup context.
  • Changing this setting in isolation without checking the linked limits, observability, and rollback path.
  • Depending on beta behavior in production without retesting the PostgreSQL 19 final release.

autovacuum_freeze_score_weight · autovacuum_multixact_freeze_score_weight · autovacuum_vacuum_score_weight · autovacuum_vacuum_insert_score_weight · autovacuum_max_workers · autovacuum_naptime

References

4 - autovacuum_analyze_threshold

autovacuum_analyze_threshold — Minimum number of tuple inserts, updates, or deletes prior to analyze. Observed in PG9.0–19 Beta 3; its last measured boot default is 50 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Minimum number of tuple inserts, updates, or deletes prior to analyze.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value02147483647
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value50
50

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 50 50

How it works

Minimum number of tuple inserts, updates, or deletes prior to analyze. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

The automatic-ANALYZE trigger is autovacuum_analyze_threshold plus autovacuum_analyze_scale_factor times pg_class.reltuples; inserts, updates, and deletes feed the cumulative counter. Per-table storage parameters can override the global values, and the statistics are eventually consistent estimates.

Monitor and change autovacuum_analyze_threshold together with autovacuum_analyze_scale_factor, default_statistics_target, track_counts. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_analyze_threshold from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 250 different 250
OLAP 500 different 500
CRIT 250 different 250
TINY 250 different 250
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 250 (dcs); OLAP: PG9.0–19 Beta 3 = 500 (dcs); CRIT: PG9.0–19 Beta 3 = 250 (dcs); TINY: PG9.0–19 Beta 3 = 250 (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to avoid analyzing very small change bursts while giving OLAP a larger base threshold; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum_analyze_scale_factor · default_statistics_target · track_counts · autovacuum · autovacuum_freeze_max_age · autovacuum_max_workers

References

5 - autovacuum_freeze_max_age

autovacuum_freeze_max_age — Age at which to autovacuum a table to prevent transaction ID wraparound. Observed in PG9.0–19 Beta 3; its last measured boot default is 200000000 in PG19 Beta 3, with postmaster context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Age at which to autovacuum a table to prevent transaction ID wraparound.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuepostmaster
Requires a server restart
Unit , Value
Raw unit
Range , Value1000002000000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value200000000
200000000

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 200000000 200000000

How it works

Age at which to autovacuum a table to prevent transaction ID wraparound. The value is fixed when the server starts, so changing it requires a restart.

Reaching the max age forces an aggressive autovacuum even if ordinary autovacuum is disabled; a per-table override can only lower the global ceiling. Safety must be assessed across every database/table age together with long transactions and replication slots.

Monitor and change autovacuum_freeze_max_age together with vacuum_freeze_min_age, vacuum_freeze_table_age, vacuum_failsafe_age. Validate on the relevant server role and real workload, then use its postmaster context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Calibrate autovacuum_freeze_max_age against the oldest XID/MXID age in every database and measured vacuum completion rate. Remove long transactions, stale slots, and blocked workers; never raise ages merely to hide a backlog.
OLAP Proactively VACUUM (FREEZE) newly loaded or static partitions in batch windows and reserve I/O time for full scans. Convert age budgets using peak transaction rate, not a wall-clock guess.
Small nodes Upstream defaults are usually safest. A small system still needs anti-wraparound maintenance; monitor every database, not only the application database.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 1000000000 different 1000000000
OLAP 1000000000 different 1000000000
CRIT 1000000000 different 1000000000
TINY 1000000000 different 1000000000
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 1000000000 (dcs); OLAP: PG9.0–19 Beta 3 = 1000000000 (dcs); CRIT: PG9.0–19 Beta 3 = 1000000000 (dcs); TINY: PG9.0–19 Beta 3 = 1000000000 (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to reduce forced anti-wraparound vacuum frequency by accepting a larger XID-age operating window; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Converting transaction age to days without using the actual transaction rate.
  • Raising the ceiling to hide blocked or underprovisioned vacuum.
  • Monitoring only the current database instead of every database and table.
  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.

vacuum_freeze_min_age · vacuum_freeze_table_age · vacuum_failsafe_age · autovacuum_multixact_freeze_max_age · vacuum_multixact_freeze_min_age · vacuum_multixact_freeze_table_age

References

6 - autovacuum_freeze_score_weight

autovacuum_freeze_score_weight — Scaling factor of freeze score for autovacuum prioritization. Observed in PG19 Beta 3; its last measured boot default is 1 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Scaling factor of freeze score for autovacuum prioritization.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value010
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value1
1

Lifecycle

Fact Value
First observed PG19 Beta 3
Present in PG19 Beta 3
Removed in No
Introduction commit d7965d65fc5b — Add rudimentary table prioritization to autovacuum.
Commit date 2026-03-27
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG19 Beta 3 1 1

How it works

PostgreSQL describes autovacuum_freeze_score_weight as follows: “Scaling factor of freeze score for autovacuum prioritization.” A configuration reload applies the value to the server without a full restart. The atlas measures it in PG19 Beta 3; boot_val is the compiled or initialized baseline, not proof of a running cluster’s effective setting.

PostgreSQL 19 scores every eligible table and sorts work by the maximum weighted component. This parameter multiplies the transaction-ID freeze age component: values above 1 raise its scheduling influence, values between 0 and 1 reduce it, and setting every score weight to 0 restores the pre-19 catalog-order strategy. pg_stat_autovacuum_scores exposes the components for inspection.

Read it together with autovacuum_multixact_freeze_score_weight, autovacuum_vacuum_score_weight, autovacuum_vacuum_insert_score_weight, autovacuum_analyze_score_weight. Check SHOW and pg_settings on the target server, verify the source and pending_restart fields, and compare workload, logs, and resource metrics before and after any change.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Start at the upstream default and use pg_stat_autovacuum_scores, table churn, freeze age, queueing, and foreground latency to justify a change. Protect wraparound work and avoid letting a busy-table preference starve quieter tables.
OLAP Batch-heavy systems can benefit from prioritizing the largest maintenance debt or parallelizing index cleanup, but benchmark I/O saturation, maintenance memory, worker contention, and completion time across the whole maintenance window.
Small nodes Keep weights and parallelism conservative. One extra worker can be a large share of CPU, RAM, and storage queue depth; first fix thresholds and ensure autovacuum has enough time to finish.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG19 Beta 3 unmodified; OLAP: PG19 Beta 3 unmodified; CRIT: PG19 Beta 3 unmodified; TINY: PG19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating the measured boot_val for autovacuum_freeze_score_weight as proof of the effective value on an initialized or managed cluster.
  • Applying a change as though it were immediate while pg_settings reports sighup context.
  • Changing this setting in isolation without checking the linked limits, observability, and rollback path.
  • Depending on beta behavior in production without retesting the PostgreSQL 19 final release.

autovacuum_multixact_freeze_score_weight · autovacuum_vacuum_score_weight · autovacuum_vacuum_insert_score_weight · autovacuum_analyze_score_weight · autovacuum_max_workers · autovacuum_naptime

References

7 - autovacuum_max_parallel_workers

autovacuum_max_parallel_workers — Maximum number of parallel workers that can be used by a single autovacuum worker. Observed in PG19 Beta 3; its last measured boot default is 0 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Maximum number of parallel workers that can be used by a single autovacuum worker.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value01024
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value0
0

Lifecycle

Fact Value
First observed PG19 Beta 3
Present in PG19 Beta 3
Removed in No
Introduction commit 1ff3180ca016 — Allow autovacuum to use parallel vacuum workers.
Commit date 2026-04-06
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG19 Beta 3 0 0

How it works

PostgreSQL describes autovacuum_max_parallel_workers as follows: “Maximum number of parallel workers that can be used by a single autovacuum worker.” A configuration reload applies the value to the server without a full restart. The atlas measures it in PG19 Beta 3; boot_val is the compiled or initialized baseline, not proof of a running cluster’s effective setting.

The limit applies per autovacuum worker and only to index vacuuming and index-cleanup phases. Zero disables parallel autovacuum; the actual count is also capped by max_parallel_workers, while each participating worker consumes CPU and maintenance memory.

Read it together with autovacuum_max_workers, autovacuum_worker_slots, max_parallel_workers, maintenance_work_mem. Check SHOW and pg_settings on the target server, verify the source and pending_restart fields, and compare workload, logs, and resource metrics before and after any change.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Start at the upstream default and use pg_stat_autovacuum_scores, table churn, freeze age, queueing, and foreground latency to justify a change. Protect wraparound work and avoid letting a busy-table preference starve quieter tables.
OLAP Batch-heavy systems can benefit from prioritizing the largest maintenance debt or parallelizing index cleanup, but benchmark I/O saturation, maintenance memory, worker contention, and completion time across the whole maintenance window.
Small nodes Keep weights and parallelism conservative. One extra worker can be a large share of CPU, RAM, and storage queue depth; first fix thresholds and ensure autovacuum has enough time to finish.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG19 Beta 3 unmodified; OLAP: PG19 Beta 3 unmodified; CRIT: PG19 Beta 3 unmodified; TINY: PG19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating the measured boot_val for autovacuum_max_parallel_workers as proof of the effective value on an initialized or managed cluster.
  • Applying a change as though it were immediate while pg_settings reports sighup context.
  • Changing this setting in isolation without checking the linked limits, observability, and rollback path.
  • Depending on beta behavior in production without retesting the PostgreSQL 19 final release.

autovacuum_max_workers · autovacuum_worker_slots · max_parallel_workers · maintenance_work_mem · autovacuum_work_mem

References

8 - autovacuum_max_workers

Sets the cluster-wide ceiling for concurrently running autovacuum workers, excluding the launcher. More workers improve scheduling capacity, but they also increase concurrent maintenance demand.
Note

Fact — official short description: “Sets the maximum number of simultaneously running autovacuum worker processes.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value1262143
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value3
3

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 3 3

How it works

The launcher starts workers across databases up to this limit. A worker can process one table at a time, several workers may operate in the same database, and these processes do not consume max_connections slots.

In PostgreSQL 18, autovacuum workers are drawn from autovacuum_worker_slots, so setting this value above the slot count has no effect. The local fact matrix also records a context change: PG10-17 required server start, while PG18 makes the setting reloadable.

Autovacuum cost limits are normally balanced among active workers. Raising only the worker count therefore improves concurrency and queueing, but does not necessarily multiply the total permitted maintenance I/O rate.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Increase gradually only when eligible tables wait too long and storage has headroom. Check worker saturation, vacuum duration, I/O latency, and autovacuum_worker_slots together.
OLAP Large relations can occupy workers for long periods, so extra workers may reduce backlog across databases. Pair any increase with explicit maintenance windows and cost-limit review.
Small nodes Two or three workers are usually a sensible starting range. Prefer fewer concurrent workers over disabling autovacuum on a constrained host.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 3 same as boot 3
OLAP 3 same as boot 3
CRIT 3 same as boot 3
TINY 2 different 2
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 3 (dcs); OLAP: PG9.0–19 Beta 3 = 3 (dcs); CRIT: PG9.0–19 Beta 3 = 3 (dcs); TINY: PG9.0–19 Beta 3 = 2 (dcs). Advice, pending human review — Editorial hypothesis, pending maintainer review: TINY reduces maintenance concurrency to limit CPU and I/O contention, while the other profiles retain conservative upstream concurrency.

Common pitfalls

  • A value above autovacuum_worker_slots is ineffective on PostgreSQL 18.
  • More workers can amplify I/O latency even when backlog improves.
  • Raising workers alone may not raise aggregate cost-based vacuum throughput.
  • A few very large tables can occupy all workers and delay unrelated databases.
  • Changing it on PG10-17 requires restart; PG18 behavior is reloadable.

autovacuum · autovacuum_worker_slots · autovacuum_naptime · autovacuum_vacuum_cost_limit · autovacuum_vacuum_cost_delay · max_worker_processes

References

9 - autovacuum_multixact_freeze_max_age

autovacuum_multixact_freeze_max_age — Multixact age at which to autovacuum a table to prevent multixact wraparound. Observed in PG9.3–19 Beta 3; its last measured boot default is 400000000 in PG19 Beta 3, with postmaster context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Multixact age at which to autovacuum a table to prevent multixact wraparound.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuepostmaster
Requires a server restart
Unit , Value
Raw unit
Range , Value100002000000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value400000000
400000000

Lifecycle

Fact Value
First observed PG9.3
Present in PG9.3–19 Beta 3
Removed in No
Introduction commit fb47de2be6e4 — Separate multixact freezing parameters from xid’s
Commit date 2014-02-13
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.3–19 Beta 3 400000000 400000000

How it works

Multixact age at which to autovacuum a table to prevent multixact wraparound. The value is fixed when the server starts, so changing it requires a restart.

Reaching the max age forces an aggressive autovacuum even if ordinary autovacuum is disabled; a per-table override can only lower the global ceiling. Safety must be assessed across every database/table age together with long transactions and replication slots.

Monitor and change autovacuum_multixact_freeze_max_age together with autovacuum_freeze_max_age, vacuum_freeze_min_age, vacuum_freeze_table_age. Validate on the relevant server role and real workload, then use its postmaster context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Calibrate autovacuum_multixact_freeze_max_age against the oldest XID/MXID age in every database and measured vacuum completion rate. Remove long transactions, stale slots, and blocked workers; never raise ages merely to hide a backlog.
OLAP Proactively VACUUM (FREEZE) newly loaded or static partitions in batch windows and reserve I/O time for full scans. Convert age budgets using peak transaction rate, not a wall-clock guess.
Small nodes Upstream defaults are usually safest. A small system still needs anti-wraparound maintenance; monitor every database, not only the application database.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.3–19 Beta 3 unmodified; OLAP: PG9.3–19 Beta 3 unmodified; CRIT: PG9.3–19 Beta 3 unmodified; TINY: PG9.3–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Ignoring MultiXact member storage pressure, which can force work earlier.
  • Assuming XID-age monitoring also covers MXID age.
  • Raising the ceiling while long-lived row locks keep generating old multixacts.
  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.

autovacuum_freeze_max_age · vacuum_freeze_min_age · vacuum_freeze_table_age · vacuum_failsafe_age · vacuum_multixact_freeze_min_age · vacuum_multixact_freeze_table_age

References

10 - autovacuum_multixact_freeze_score_weight

autovacuum_multixact_freeze_score_weight — Scaling factor of multixact freeze score for autovacuum prioritization. Observed in PG19 Beta 3; its last measured boot default is 1 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Scaling factor of multixact freeze score for autovacuum prioritization.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value010
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value1
1

Lifecycle

Fact Value
First observed PG19 Beta 3
Present in PG19 Beta 3
Removed in No
Introduction commit d7965d65fc5b — Add rudimentary table prioritization to autovacuum.
Commit date 2026-03-27
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG19 Beta 3 1 1

How it works

PostgreSQL describes autovacuum_multixact_freeze_score_weight as follows: “Scaling factor of multixact freeze score for autovacuum prioritization.” A configuration reload applies the value to the server without a full restart. The atlas measures it in PG19 Beta 3; boot_val is the compiled or initialized baseline, not proof of a running cluster’s effective setting.

PostgreSQL 19 scores every eligible table and sorts work by the maximum weighted component. This parameter multiplies the MultiXact freeze age component: values above 1 raise its scheduling influence, values between 0 and 1 reduce it, and setting every score weight to 0 restores the pre-19 catalog-order strategy. pg_stat_autovacuum_scores exposes the components for inspection.

Read it together with autovacuum_freeze_score_weight, autovacuum_vacuum_score_weight, autovacuum_vacuum_insert_score_weight, autovacuum_analyze_score_weight. Check SHOW and pg_settings on the target server, verify the source and pending_restart fields, and compare workload, logs, and resource metrics before and after any change.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Start at the upstream default and use pg_stat_autovacuum_scores, table churn, freeze age, queueing, and foreground latency to justify a change. Protect wraparound work and avoid letting a busy-table preference starve quieter tables.
OLAP Batch-heavy systems can benefit from prioritizing the largest maintenance debt or parallelizing index cleanup, but benchmark I/O saturation, maintenance memory, worker contention, and completion time across the whole maintenance window.
Small nodes Keep weights and parallelism conservative. One extra worker can be a large share of CPU, RAM, and storage queue depth; first fix thresholds and ensure autovacuum has enough time to finish.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG19 Beta 3 unmodified; OLAP: PG19 Beta 3 unmodified; CRIT: PG19 Beta 3 unmodified; TINY: PG19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating the measured boot_val for autovacuum_multixact_freeze_score_weight as proof of the effective value on an initialized or managed cluster.
  • Applying a change as though it were immediate while pg_settings reports sighup context.
  • Changing this setting in isolation without checking the linked limits, observability, and rollback path.
  • Depending on beta behavior in production without retesting the PostgreSQL 19 final release.

autovacuum_freeze_score_weight · autovacuum_vacuum_score_weight · autovacuum_vacuum_insert_score_weight · autovacuum_analyze_score_weight · autovacuum_max_workers · autovacuum_naptime

References

11 - autovacuum_naptime

autovacuum_naptime — Time to sleep between autovacuum runs. Observed in PG9.0–19 Beta 3; its last measured boot default is 1 min in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Time to sleep between autovacuum runs.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Values
Raw unit
Range , Value12147483
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value60
1 min

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 60 s 1 min

How it works

Time to sleep between autovacuum runs. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

The launcher aims to start work in each database once per interval; with N databases, launch attempts are spread at roughly naptime/N. It is not a fixed per-table polling period, and worker availability plus long-running jobs can add delay.

Monitor and change autovacuum_naptime together with autovacuum, autovacuum_max_workers, autovacuum_worker_slots. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_naptime from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 1min same as boot 1min
OLAP 1min same as boot 1min
CRIT 1min same as boot 1min
TINY 1min same as boot 1min
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 1min (dcs); OLAP: PG9.0–19 Beta 3 = 1min (dcs); CRIT: PG9.0–19 Beta 3 = 1min (dcs); TINY: PG9.0–19 Beta 3 = 1min (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to retain PostgreSQL’s one-minute database scheduling cadence explicitly; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum · autovacuum_max_workers · autovacuum_worker_slots · autovacuum_work_mem · track_counts · autovacuum_analyze_scale_factor

References

12 - autovacuum_vacuum_cost_delay

autovacuum_vacuum_cost_delay — Vacuum cost delay in milliseconds, for autovacuum. Observed in PG9.0–19 Beta 3; its last measured boot default is 2 ms in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Vacuum cost delay in milliseconds, for autovacuum.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Valuems
Raw unit
Range , Value-1100
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value2
2 ms

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–11 20 ms 20 ms
PG12–19 Beta 3 2 ms 2 ms

How it works

Vacuum cost delay in milliseconds, for autovacuum. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

These values govern cost throttling for autovacuum workers; -1 inherits vacuum_cost_delay or vacuum_cost_limit respectively. With multiple active workers, the autovacuum cost budget is balanced among them, so a per-worker reading is not simply multiplied by concurrency.

Monitor and change autovacuum_vacuum_cost_delay together with vacuum_cost_delay, vacuum_cost_limit, vacuum_cost_page_hit. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_vacuum_cost_delay from autovacuum duration, dead-tuple growth, and foreground I/O latency together. Prefer per-table overrides for hotspots; global throttling must not let cleanup fall permanently behind.
OLAP During post-load windows, a larger budget or shorter delay can improve maintenance throughput, but verify that scans do not starve queries/imports. Failsafe activation means normal pacing already failed.
Small nodes Keep conservative defaults. On slow disks, lowering concurrency or overriding one table is usually more controllable than making the delay arbitrarily large.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP -1 different -1
OLAP -1 different -1
CRIT -1 different -1
TINY -1 different -1
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = -1 (dcs); OLAP: PG9.0–19 Beta 3 = -1 (dcs); CRIT: PG9.0–19 Beta 3 = -1 (dcs); TINY: PG9.0–19 Beta 3 = -1 (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to delegate autovacuum delay to the ordinary vacuum cost setting via the -1 inheritance value; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

vacuum_cost_delay · vacuum_cost_limit · vacuum_cost_page_hit · vacuum_cost_page_miss · vacuum_cost_page_dirty · autovacuum_vacuum_cost_limit

References

13 - autovacuum_vacuum_cost_limit

autovacuum_vacuum_cost_limit — Vacuum cost amount available before napping, for autovacuum. Observed in PG9.0–19 Beta 3; its last measured boot default is -1 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Vacuum cost amount available before napping, for autovacuum.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value-110000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value-1
-1

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 -1 -1

How it works

Vacuum cost amount available before napping, for autovacuum. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

These values govern cost throttling for autovacuum workers; -1 inherits vacuum_cost_delay or vacuum_cost_limit respectively. With multiple active workers, the autovacuum cost budget is balanced among them, so a per-worker reading is not simply multiplied by concurrency.

Monitor and change autovacuum_vacuum_cost_limit together with vacuum_cost_delay, vacuum_cost_limit, vacuum_cost_page_hit. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_vacuum_cost_limit from autovacuum duration, dead-tuple growth, and foreground I/O latency together. Prefer per-table overrides for hotspots; global throttling must not let cleanup fall permanently behind.
OLAP During post-load windows, a larger budget or shorter delay can improve maintenance throughput, but verify that scans do not starve queries/imports. Failsafe activation means normal pacing already failed.
Small nodes Keep conservative defaults. On slow disks, lowering concurrency or overriding one table is usually more controllable than making the delay arbitrarily large.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP -1 same as boot -1
OLAP -1 same as boot -1
CRIT -1 same as boot -1
TINY -1 same as boot -1
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = -1 (dcs); OLAP: PG9.0–19 Beta 3 = -1 (dcs); CRIT: PG9.0–19 Beta 3 = -1 (dcs); TINY: PG9.0–19 Beta 3 = -1 (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to delegate autovacuum’s cost budget to vacuum_cost_limit via the -1 inheritance value; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

vacuum_cost_delay · vacuum_cost_limit · vacuum_cost_page_hit · vacuum_cost_page_miss · vacuum_cost_page_dirty · autovacuum_vacuum_cost_delay

References

14 - autovacuum_vacuum_insert_scale_factor

autovacuum_vacuum_insert_scale_factor sets the number of tuple inserts prior to vacuum as a fraction of reltuples. It is a sighup setting present in PG13–18; the latest recorded boot default is 0.2.
Note

Fact — official short description: “Number of tuple inserts prior to vacuum as a fraction of reltuples.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value0100
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value0.2
0.2

Lifecycle

Fact Value
First observed PG13
Present in PG13–19 Beta 3
Removed in No
Introduction commit b07642dbcd8d — Trigger autovacuum based on number of INSERTs
Commit date 2020-03-28
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG13–19 Beta 3 0.2 0.2

How it works

Number of tuple inserts prior to vacuum as a fraction of reltuples. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

For insert-heavy tables the trigger is the insert threshold plus insert scale factor times reltuples times the fraction not all-frozen. Such vacuuming can advance visibility/freeze state even without dead tuples and reduce later aggressive-vacuum work.

Monitor and change autovacuum_vacuum_insert_scale_factor together with autovacuum_vacuum_threshold, autovacuum_vacuum_scale_factor, autovacuum_vacuum_max_threshold. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_vacuum_insert_scale_factor from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG13–19 Beta 3 unmodified; OLAP: PG13–19 Beta 3 unmodified; CRIT: PG13–19 Beta 3 unmodified; TINY: PG13–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum_vacuum_threshold · autovacuum_vacuum_scale_factor · autovacuum_vacuum_max_threshold · autovacuum_vacuum_insert_threshold · autovacuum · autovacuum_analyze_scale_factor

References

15 - autovacuum_vacuum_insert_score_weight

autovacuum_vacuum_insert_score_weight — Scaling factor of vacuum insert score for autovacuum prioritization. Observed in PG19 Beta 3; its last measured boot default is 1 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Scaling factor of vacuum insert score for autovacuum prioritization.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value010
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value1
1

Lifecycle

Fact Value
First observed PG19 Beta 3
Present in PG19 Beta 3
Removed in No
Introduction commit d7965d65fc5b — Add rudimentary table prioritization to autovacuum.
Commit date 2026-03-27
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG19 Beta 3 1 1

How it works

PostgreSQL describes autovacuum_vacuum_insert_score_weight as follows: “Scaling factor of vacuum insert score for autovacuum prioritization.” A configuration reload applies the value to the server without a full restart. The atlas measures it in PG19 Beta 3; boot_val is the compiled or initialized baseline, not proof of a running cluster’s effective setting.

PostgreSQL 19 scores every eligible table and sorts work by the maximum weighted component. This parameter multiplies the insert-driven vacuum pressure component: values above 1 raise its scheduling influence, values between 0 and 1 reduce it, and setting every score weight to 0 restores the pre-19 catalog-order strategy. pg_stat_autovacuum_scores exposes the components for inspection.

Read it together with autovacuum_freeze_score_weight, autovacuum_multixact_freeze_score_weight, autovacuum_vacuum_score_weight, autovacuum_analyze_score_weight. Check SHOW and pg_settings on the target server, verify the source and pending_restart fields, and compare workload, logs, and resource metrics before and after any change.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Start at the upstream default and use pg_stat_autovacuum_scores, table churn, freeze age, queueing, and foreground latency to justify a change. Protect wraparound work and avoid letting a busy-table preference starve quieter tables.
OLAP Batch-heavy systems can benefit from prioritizing the largest maintenance debt or parallelizing index cleanup, but benchmark I/O saturation, maintenance memory, worker contention, and completion time across the whole maintenance window.
Small nodes Keep weights and parallelism conservative. One extra worker can be a large share of CPU, RAM, and storage queue depth; first fix thresholds and ensure autovacuum has enough time to finish.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG19 Beta 3 unmodified; OLAP: PG19 Beta 3 unmodified; CRIT: PG19 Beta 3 unmodified; TINY: PG19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating the measured boot_val for autovacuum_vacuum_insert_score_weight as proof of the effective value on an initialized or managed cluster.
  • Applying a change as though it were immediate while pg_settings reports sighup context.
  • Changing this setting in isolation without checking the linked limits, observability, and rollback path.
  • Depending on beta behavior in production without retesting the PostgreSQL 19 final release.

autovacuum_freeze_score_weight · autovacuum_multixact_freeze_score_weight · autovacuum_vacuum_score_weight · autovacuum_analyze_score_weight · autovacuum_max_workers · autovacuum_naptime

References

16 - autovacuum_vacuum_insert_threshold

autovacuum_vacuum_insert_threshold sets the minimum number of tuple inserts prior to vacuum. It is a sighup setting present in PG13–18; the latest recorded boot default is 1000.
Note

Fact — official short description: “Minimum number of tuple inserts prior to vacuum.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value-12147483647
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value1000
1000

Lifecycle

Fact Value
First observed PG13
Present in PG13–19 Beta 3
Removed in No
Introduction commit b07642dbcd8d — Trigger autovacuum based on number of INSERTs
Commit date 2020-03-28
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG13–19 Beta 3 1000 1000

How it works

Minimum number of tuple inserts prior to vacuum. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

For insert-heavy tables the trigger is the insert threshold plus insert scale factor times reltuples times the fraction not all-frozen. Such vacuuming can advance visibility/freeze state even without dead tuples and reduce later aggressive-vacuum work.

Monitor and change autovacuum_vacuum_insert_threshold together with autovacuum_vacuum_threshold, autovacuum_vacuum_scale_factor, autovacuum_vacuum_max_threshold. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_vacuum_insert_threshold from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG13–19 Beta 3 unmodified; OLAP: PG13–19 Beta 3 unmodified; CRIT: PG13–19 Beta 3 unmodified; TINY: PG13–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum_vacuum_threshold · autovacuum_vacuum_scale_factor · autovacuum_vacuum_max_threshold · autovacuum_vacuum_insert_scale_factor · autovacuum · autovacuum_analyze_scale_factor

References

17 - autovacuum_vacuum_max_threshold

autovacuum_vacuum_max_threshold — Maximum number of tuple updates or deletes prior to vacuum. Observed in PG18–19 Beta 3; its last measured boot default is 100000000 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Maximum number of tuple updates or deletes prior to vacuum.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value-12147483647
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value100000000
100000000

Lifecycle

Fact Value
First observed PG18
Present in PG18–19 Beta 3
Removed in No
Introduction commit 306dc520b9df — Introduce autovacuum_vacuum_max_threshold.
Commit date 2025-02-05
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG18–19 Beta 3 100000000 100000000

How it works

Maximum number of tuple updates or deletes prior to vacuum. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

The ordinary automatic-vacuum threshold is the base term plus scale factor times reltuples, capped by autovacuum_vacuum_max_threshold from PG18. It reacts to dead tuples from updates/deletes, permits per-table overrides, and is separate from mandatory anti-wraparound vacuuming.

Monitor and change autovacuum_vacuum_max_threshold together with autovacuum_vacuum_threshold, autovacuum_vacuum_scale_factor, autovacuum_vacuum_insert_threshold. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_vacuum_max_threshold from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG18–19 Beta 3 unmodified; OLAP: PG18–19 Beta 3 unmodified; CRIT: PG18–19 Beta 3 unmodified; TINY: PG18–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum_vacuum_threshold · autovacuum_vacuum_scale_factor · autovacuum_vacuum_insert_threshold · autovacuum_vacuum_insert_scale_factor · autovacuum · autovacuum_analyze_scale_factor

References

18 - autovacuum_vacuum_scale_factor

Controls the table-size-proportional part of the normal autovacuum VACUUM trigger. Lower values make large tables eligible after a smaller fraction of rows becomes obsolete.
Note

Fact — official short description: “Number of tuple updates or deletes prior to vacuum as a fraction of reltuples.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value0100
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value0.2
0.2

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 0.2 0.2

How it works

The core trigger is the base threshold plus this factor multiplied by pg_class.reltuples, an approximate row count. In PostgreSQL 18 the result is also capped by autovacuum_vacuum_max_threshold.

This trigger counts tuples made obsolete by UPDATE or DELETE; insert-driven vacuuming has its own threshold and scale factor. Anti-wraparound vacuuming is governed by transaction-age rules and can run independently of this setting.

A table-level autovacuum_vacuum_scale_factor storage parameter overrides the global value, which is often preferable when table sizes and update rates vary widely.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Use lower per-table values on large, update-heavy tables so dead tuples do not accumulate into a large absolute backlog. Validate with table churn and vacuum duration rather than selecting a percentage in isolation.
OLAP For append-and-batch workloads, coordinate the threshold with load cycles and explicit VACUUM/ANALYZE. A low global factor can create unwanted maintenance during bulk jobs.
Small nodes The upstream default is often adequate for genuinely small tables. Tune exceptions per table; a low cluster-wide value can create frequent tiny vacuums.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 0.08 different 0.08
OLAP 0.08 different 0.08
CRIT 0.08 different 0.08
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 0.08 (dcs); OLAP: PG9.0–19 Beta 3 = 0.08 (dcs); CRIT: PG9.0–19 Beta 3 = 0.08 (dcs); TINY: PG9.0–19 Beta 3 unmodified. Advice, pending human review — Editorial hypothesis, pending maintainer review: the larger profiles favor earlier cleanup to bound absolute dead-tuple accumulation on sizable tables; TINY avoids extra vacuum frequency on constrained systems.

Common pitfalls

  • A percentage that looks small can still represent millions of dead tuples on a large table.
  • Lowering the factor globally can create continuous I/O pressure across many tables.
  • It does not control insert-triggered vacuuming or anti-wraparound vacuuming.
  • reltuples is an estimate, so the trigger is not an exact dead-row percentage.
  • Table storage parameters can silently make the global value irrelevant for that table.

autovacuum_vacuum_threshold · autovacuum_vacuum_max_threshold · autovacuum_vacuum_insert_scale_factor · autovacuum_analyze_scale_factor · autovacuum_naptime · autovacuum_freeze_max_age

References

19 - autovacuum_vacuum_score_weight

autovacuum_vacuum_score_weight — Scaling factor of vacuum score for autovacuum prioritization. Observed in PG19 Beta 3; its last measured boot default is 1 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Scaling factor of vacuum score for autovacuum prioritization.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value010
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value1
1

Lifecycle

Fact Value
First observed PG19 Beta 3
Present in PG19 Beta 3
Removed in No
Introduction commit d7965d65fc5b — Add rudimentary table prioritization to autovacuum.
Commit date 2026-03-27
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG19 Beta 3 1 1

How it works

PostgreSQL describes autovacuum_vacuum_score_weight as follows: “Scaling factor of vacuum score for autovacuum prioritization.” A configuration reload applies the value to the server without a full restart. The atlas measures it in PG19 Beta 3; boot_val is the compiled or initialized baseline, not proof of a running cluster’s effective setting.

PostgreSQL 19 scores every eligible table and sorts work by the maximum weighted component. This parameter multiplies the updated/deleted-tuple vacuum pressure component: values above 1 raise its scheduling influence, values between 0 and 1 reduce it, and setting every score weight to 0 restores the pre-19 catalog-order strategy. pg_stat_autovacuum_scores exposes the components for inspection.

Read it together with autovacuum_freeze_score_weight, autovacuum_multixact_freeze_score_weight, autovacuum_vacuum_insert_score_weight, autovacuum_analyze_score_weight. Check SHOW and pg_settings on the target server, verify the source and pending_restart fields, and compare workload, logs, and resource metrics before and after any change.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Start at the upstream default and use pg_stat_autovacuum_scores, table churn, freeze age, queueing, and foreground latency to justify a change. Protect wraparound work and avoid letting a busy-table preference starve quieter tables.
OLAP Batch-heavy systems can benefit from prioritizing the largest maintenance debt or parallelizing index cleanup, but benchmark I/O saturation, maintenance memory, worker contention, and completion time across the whole maintenance window.
Small nodes Keep weights and parallelism conservative. One extra worker can be a large share of CPU, RAM, and storage queue depth; first fix thresholds and ensure autovacuum has enough time to finish.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG19 Beta 3 unmodified; OLAP: PG19 Beta 3 unmodified; CRIT: PG19 Beta 3 unmodified; TINY: PG19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating the measured boot_val for autovacuum_vacuum_score_weight as proof of the effective value on an initialized or managed cluster.
  • Applying a change as though it were immediate while pg_settings reports sighup context.
  • Changing this setting in isolation without checking the linked limits, observability, and rollback path.
  • Depending on beta behavior in production without retesting the PostgreSQL 19 final release.

autovacuum_freeze_score_weight · autovacuum_multixact_freeze_score_weight · autovacuum_vacuum_insert_score_weight · autovacuum_analyze_score_weight · autovacuum_max_workers · autovacuum_naptime

References

20 - autovacuum_vacuum_threshold

autovacuum_vacuum_threshold — Minimum number of tuple updates or deletes prior to vacuum. Observed in PG9.0–19 Beta 3; its last measured boot default is 50 in PG19 Beta 3, with sighup context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Minimum number of tuple updates or deletes prior to vacuum.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuesighup
Takes effect after configuration reload
Unit , Value
Raw unit
Range , Value02147483647
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value50
50

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 50 50

How it works

Minimum number of tuple updates or deletes prior to vacuum. A configuration reload applies a new value; existing work already in flight is not retroactively changed.

The ordinary automatic-vacuum threshold is the base term plus scale factor times reltuples, capped by autovacuum_vacuum_max_threshold from PG18. It reacts to dead tuples from updates/deletes, permits per-table overrides, and is separate from mandatory anti-wraparound vacuuming.

Monitor and change autovacuum_vacuum_threshold together with autovacuum_vacuum_scale_factor, autovacuum_vacuum_max_threshold, autovacuum_vacuum_insert_threshold. Validate on the relevant server role and real workload, then use its sighup context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_vacuum_threshold from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 500 different 500
OLAP 1000 different 1000
CRIT 500 different 500
TINY 500 different 500
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 500 (dcs); OLAP: PG9.0–19 Beta 3 = 1000 (dcs); CRIT: PG9.0–19 Beta 3 = 500 (dcs); TINY: PG9.0–19 Beta 3 = 500 (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to raise the fixed trigger term so small tables are not vacuumed after only a handful of dead tuples; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum_vacuum_scale_factor · autovacuum_vacuum_max_threshold · autovacuum_vacuum_insert_threshold · autovacuum_vacuum_insert_scale_factor · autovacuum · autovacuum_analyze_scale_factor

References

21 - autovacuum_worker_slots

autovacuum_worker_slots — Sets the number of backend slots to allocate for autovacuum workers. Observed in PG18–19 Beta 3; its last measured boot default is 16 in PG19 Beta 3, with postmaster context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Sets the number of backend slots to allocate for autovacuum workers.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valuepostmaster
Requires a server restart
Unit , Value
Raw unit
Range , Value1262143
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Automatic Vacuuming
Upstream classification
Latest boot value , Value16
16

Lifecycle

Fact Value
First observed PG18
Present in PG18–19 Beta 3
Removed in No
Introduction commit c758119e5bfb — Allow changing autovacuum_max_workers without restarting.
Commit date 2025-01-06
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG18–19 Beta 3 16 16

How it works

Sets the number of backend slots to allocate for autovacuum workers. The value is fixed when the server starts, so changing it requires a restart.

PG18 separates the startup allocation of backend slots for autovacuum workers from the active concurrency limit autovacuum_max_workers. The slots are reserved at startup so the worker limit can be reloaded within that allocation.

Monitor and change autovacuum_worker_slots together with autovacuum, autovacuum_naptime, autovacuum_max_workers. Validate on the relevant server role and real workload, then use its postmaster context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune autovacuum_worker_slots from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG18–19 Beta 3 unmodified; OLAP: PG18–19 Beta 3 unmodified; CRIT: PG18–19 Beta 3 unmodified; TINY: PG18–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

autovacuum · autovacuum_naptime · autovacuum_max_workers · autovacuum_work_mem · track_counts · autovacuum_analyze_scale_factor

References

22 - vacuum_cost_delay

vacuum_cost_delay — Vacuum cost delay in milliseconds. Observed in PG9.0–19 Beta 3; its last measured boot default is 0 ms in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Vacuum cost delay in milliseconds.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Valuems
Raw unit
Range , Value0100
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Cost-Based Vacuum Delay
Upstream classification
Latest boot value , Value0
0 ms

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 0 ms 0 ms

How it works

Vacuum cost delay in milliseconds. It can be changed at session scope, so different sessions may observe different behavior.

VACUUM accumulates virtual cost for page hits, misses, and dirties; after the balance reaches vacuum_cost_limit it sleeps for vacuum_cost_delay and resets. This is coarse I/O pacing rather than an exact bandwidth cap, and the wraparound failsafe bypasses throttling.

Monitor and change vacuum_cost_delay together with vacuum_cost_limit, vacuum_cost_page_hit, vacuum_cost_page_miss. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune vacuum_cost_delay from autovacuum duration, dead-tuple growth, and foreground I/O latency together. Prefer per-table overrides for hotspots; global throttling must not let cleanup fall permanently behind.
OLAP During post-load windows, a larger budget or shorter delay can improve maintenance throughput, but verify that scans do not starve queries/imports. Failsafe activation means normal pacing already failed.
Small nodes Keep conservative defaults. On slow disks, lowering concurrency or overriding one table is usually more controllable than making the delay arbitrarily large.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 20ms different 20ms
OLAP 10ms different 10ms
CRIT 20ms different 20ms
TINY 20ms different 20ms
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 20ms (dcs); OLAP: PG9.0–19 Beta 3 = 10ms (dcs); CRIT: PG9.0–19 Beta 3 = 20ms (dcs); TINY: PG9.0–19 Beta 3 = 20ms (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to throttle manual and inherited autovacuum I/O, with a shorter delay for the higher-throughput OLAP profile; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

vacuum_cost_limit · vacuum_cost_page_hit · vacuum_cost_page_miss · vacuum_cost_page_dirty · autovacuum_vacuum_cost_delay · autovacuum_vacuum_cost_limit

References

23 - vacuum_cost_limit

vacuum_cost_limit — Vacuum cost amount available before napping. Observed in PG9.0–19 Beta 3; its last measured boot default is 200 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Vacuum cost amount available before napping.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value110000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Cost-Based Vacuum Delay
Upstream classification
Latest boot value , Value200
200

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 200 200

How it works

Vacuum cost amount available before napping. It can be changed at session scope, so different sessions may observe different behavior.

VACUUM accumulates virtual cost for page hits, misses, and dirties; after the balance reaches vacuum_cost_limit it sleeps for vacuum_cost_delay and resets. This is coarse I/O pacing rather than an exact bandwidth cap, and the wraparound failsafe bypasses throttling.

Monitor and change vacuum_cost_limit together with vacuum_cost_delay, vacuum_cost_page_hit, vacuum_cost_page_miss. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune vacuum_cost_limit from autovacuum duration, dead-tuple growth, and foreground I/O latency together. Prefer per-table overrides for hotspots; global throttling must not let cleanup fall permanently behind.
OLAP During post-load windows, a larger budget or shorter delay can improve maintenance throughput, but verify that scans do not starve queries/imports. Failsafe activation means normal pacing already failed.
Small nodes Keep conservative defaults. On slow disks, lowering concurrency or overriding one table is usually more controllable than making the delay arbitrarily large.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP 2000 different 2000
OLAP 10000 different 10000
CRIT 2000 different 2000
TINY 2000 different 2000
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 = 2000 (dcs); OLAP: PG9.0–19 Beta 3 = 10000 (dcs); CRIT: PG9.0–19 Beta 3 = 2000 (dcs); TINY: PG9.0–19 Beta 3 = 2000 (dcs). Advice, pending human review — Editorial interpretation, pending human maintainer review: the override appears intended to pair the delay with a much larger work budget, especially for OLAP maintenance; confirm it against the current Pigsty templates, hardware fixture, and operational guarantees before publication.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

vacuum_cost_delay · vacuum_cost_page_hit · vacuum_cost_page_miss · vacuum_cost_page_dirty · autovacuum_vacuum_cost_delay · autovacuum_vacuum_cost_limit

References

24 - vacuum_cost_page_dirty

vacuum_cost_page_dirty — Vacuum cost for a page dirtied by vacuum. Observed in PG9.0–19 Beta 3; its last measured boot default is 20 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Vacuum cost for a page dirtied by vacuum.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value010000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Cost-Based Vacuum Delay
Upstream classification
Latest boot value , Value20
20

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 20 20

How it works

Vacuum cost for a page dirtied by vacuum. It can be changed at session scope, so different sessions may observe different behavior.

VACUUM accumulates virtual cost for page hits, misses, and dirties; after the balance reaches vacuum_cost_limit it sleeps for vacuum_cost_delay and resets. This is coarse I/O pacing rather than an exact bandwidth cap, and the wraparound failsafe bypasses throttling.

Monitor and change vacuum_cost_page_dirty together with vacuum_cost_delay, vacuum_cost_limit, vacuum_cost_page_hit. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune vacuum_cost_page_dirty from autovacuum duration, dead-tuple growth, and foreground I/O latency together. Prefer per-table overrides for hotspots; global throttling must not let cleanup fall permanently behind.
OLAP During post-load windows, a larger budget or shorter delay can improve maintenance throughput, but verify that scans do not starve queries/imports. Failsafe activation means normal pacing already failed.
Small nodes Keep conservative defaults. On slow disks, lowering concurrency or overriding one table is usually more controllable than making the delay arbitrarily large.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 unmodified; OLAP: PG9.0–19 Beta 3 unmodified; CRIT: PG9.0–19 Beta 3 unmodified; TINY: PG9.0–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

vacuum_cost_delay · vacuum_cost_limit · vacuum_cost_page_hit · vacuum_cost_page_miss · autovacuum_vacuum_cost_delay · autovacuum_vacuum_cost_limit

References

25 - vacuum_cost_page_hit

vacuum_cost_page_hit — Vacuum cost for a page found in the buffer cache. Observed in PG9.0–19 Beta 3; its last measured boot default is 1 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Vacuum cost for a page found in the buffer cache.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value010000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Cost-Based Vacuum Delay
Upstream classification
Latest boot value , Value1
1

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 1 1

How it works

Vacuum cost for a page found in the buffer cache. It can be changed at session scope, so different sessions may observe different behavior.

VACUUM accumulates virtual cost for page hits, misses, and dirties; after the balance reaches vacuum_cost_limit it sleeps for vacuum_cost_delay and resets. This is coarse I/O pacing rather than an exact bandwidth cap, and the wraparound failsafe bypasses throttling.

Monitor and change vacuum_cost_page_hit together with vacuum_cost_delay, vacuum_cost_limit, vacuum_cost_page_miss. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune vacuum_cost_page_hit from autovacuum duration, dead-tuple growth, and foreground I/O latency together. Prefer per-table overrides for hotspots; global throttling must not let cleanup fall permanently behind.
OLAP During post-load windows, a larger budget or shorter delay can improve maintenance throughput, but verify that scans do not starve queries/imports. Failsafe activation means normal pacing already failed.
Small nodes Keep conservative defaults. On slow disks, lowering concurrency or overriding one table is usually more controllable than making the delay arbitrarily large.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 unmodified; OLAP: PG9.0–19 Beta 3 unmodified; CRIT: PG9.0–19 Beta 3 unmodified; TINY: PG9.0–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

vacuum_cost_delay · vacuum_cost_limit · vacuum_cost_page_miss · vacuum_cost_page_dirty · autovacuum_vacuum_cost_delay · autovacuum_vacuum_cost_limit

References

26 - vacuum_cost_page_miss

vacuum_cost_page_miss — Vacuum cost for a page not found in the buffer cache. Observed in PG9.0–19 Beta 3; its last measured boot default is 2 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Vacuum cost for a page not found in the buffer cache.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value010000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Cost-Based Vacuum Delay
Upstream classification
Latest boot value , Value2
2

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–13 10 10
PG14–19 Beta 3 2 2

How it works

Vacuum cost for a page not found in the buffer cache. It can be changed at session scope, so different sessions may observe different behavior.

VACUUM accumulates virtual cost for page hits, misses, and dirties; after the balance reaches vacuum_cost_limit it sleeps for vacuum_cost_delay and resets. This is coarse I/O pacing rather than an exact bandwidth cap, and the wraparound failsafe bypasses throttling.

Monitor and change vacuum_cost_page_miss together with vacuum_cost_delay, vacuum_cost_limit, vacuum_cost_page_hit. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune vacuum_cost_page_miss from autovacuum duration, dead-tuple growth, and foreground I/O latency together. Prefer per-table overrides for hotspots; global throttling must not let cleanup fall permanently behind.
OLAP During post-load windows, a larger budget or shorter delay can improve maintenance throughput, but verify that scans do not starve queries/imports. Failsafe activation means normal pacing already failed.
Small nodes Keep conservative defaults. On slow disks, lowering concurrency or overriding one table is usually more controllable than making the delay arbitrarily large.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 unmodified; OLAP: PG9.0–19 Beta 3 unmodified; CRIT: PG9.0–19 Beta 3 unmodified; TINY: PG9.0–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.
  • Blaming a threshold without checking long transactions, replication slots, and worker saturation.
  • Buying short-term quiet by deferring maintenance until wraparound failsafe activates.

vacuum_cost_delay · vacuum_cost_limit · vacuum_cost_page_hit · vacuum_cost_page_dirty · autovacuum_vacuum_cost_delay · autovacuum_vacuum_cost_limit

References

27 - vacuum_failsafe_age

vacuum_failsafe_age sets the age at which VACUUM should trigger failsafe to avoid a wraparound outage. It is a user setting present in PG14–18; the latest recorded boot default is 1600000000.
Note

Fact — official short description: “Age at which VACUUM should trigger failsafe to avoid a wraparound outage.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value02100000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Freezing
Upstream classification
Latest boot value , Value1600000000
1600000000

Lifecycle

Fact Value
First observed PG14
Present in PG14–19 Beta 3
Removed in No
Introduction commit 1e55e7d1755c — Add wraparound failsafe to VACUUM.
Commit date 2021-04-07
Discussion thread 1 · thread 2

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG14–19 Beta 3 1600000000 1600000000

How it works

Age at which VACUUM should trigger failsafe to avoid a wraparound outage. It can be changed at session scope, so different sessions may observe different behavior.

At the failsafe age, a running VACUUM prioritizes advancing the freeze horizon quickly: cost delays stop and optional work such as index cleanup and tail truncation is skipped. This is a last defense against wraparound outage, not a routine performance mode.

Monitor and change vacuum_failsafe_age together with autovacuum_freeze_max_age, vacuum_freeze_min_age, vacuum_freeze_table_age. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Calibrate vacuum_failsafe_age against the oldest XID/MXID age in every database and measured vacuum completion rate. Remove long transactions, stale slots, and blocked workers; never raise ages merely to hide a backlog.
OLAP Proactively VACUUM (FREEZE) newly loaded or static partitions in batch windows and reserve I/O time for full scans. Convert age budgets using peak transaction rate, not a wall-clock guess.
Small nodes Upstream defaults are usually safest. A small system still needs anti-wraparound maintenance; monitor every database, not only the application database.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG14–19 Beta 3 unmodified; OLAP: PG14–19 Beta 3 unmodified; CRIT: PG14–19 Beta 3 unmodified; TINY: PG14–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating failsafe as a normal high-throughput VACUUM mode.
  • Ignoring skipped index cleanup after the emergency has passed.
  • Raising the age to suppress evidence of a maintenance failure.
  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.

autovacuum_freeze_max_age · vacuum_freeze_min_age · vacuum_freeze_table_age · autovacuum_multixact_freeze_max_age · vacuum_multixact_freeze_min_age · vacuum_multixact_freeze_table_age

References

28 - vacuum_freeze_min_age

vacuum_freeze_min_age — Minimum age at which VACUUM should freeze a table row. Observed in PG9.0–19 Beta 3; its last measured boot default is 50000000 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Minimum age at which VACUUM should freeze a table row.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value01000000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Freezing
Upstream classification
Latest boot value , Value50000000
50000000

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 50000000 50000000

How it works

Sets the minimum XID age at which VACUUM freezes tuple xmin values. It is a user-context setting, so a session can override it for manual VACUUM.

VACUUM computes an XID freeze cutoff from this age. Lower values freeze XIDs earlier and can repeat work on rows soon updated; higher values defer work. The effective value is capped at half of autovacuum_freeze_max_age.

Track age(relfrozenxid) for tables and age(datfrozenxid) for every database. Interpret this lower cutoff with vacuum_freeze_table_age, autovacuum_freeze_max_age, and vacuum_failsafe_age; the separate vacuum_multixact_freeze_min_age controls MXIDs.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Keep enough distance below autovacuum_freeze_max_age for routine vacuums to advance relfrozenxid. Tune from peak XID consumption and measured vacuum completion, not days on a calendar.
OLAP For append-mostly or static partitions, a lower value during planned VACUUM can freeze XIDs earlier and reduce later aggressive work; verify the extra WAL and scan cost.
Small nodes Keep the upstream default unless XID-age evidence justifies a change. Small databases still share the cluster transaction counter and need every database monitored.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 unmodified; OLAP: PG9.0–19 Beta 3 unmodified; CRIT: PG9.0–19 Beta 3 unmodified; TINY: PG9.0–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Describing the cutoff as an MXID control; MultiXacts use vacuum_multixact_freeze_min_age.
  • Converting XID age to time without the measured transaction rate.
  • Raising the value so far that routine vacuum loses useful headroom before anti-wraparound work.
  • Ignoring per-table autovacuum_freeze_min_age overrides.

autovacuum_freeze_max_age · vacuum_freeze_table_age · vacuum_failsafe_age · vacuum_multixact_freeze_min_age · autovacuum · log_autovacuum_min_duration

References

29 - vacuum_freeze_table_age

vacuum_freeze_table_age — Age at which VACUUM should scan whole table to freeze tuples. Observed in PG9.0–19 Beta 3; its last measured boot default is 150000000 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Age at which VACUUM should scan whole table to freeze tuples.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value02000000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Freezing
Upstream classification
Latest boot value , Value150000000
150000000

Lifecycle

Fact Value
First observed PG9.0 (research boundary)
Present in PG9.0–19 Beta 3
Removed in No
Introduction commit Not asserted: predates the PG9.0 research boundary
Commit date
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.0–19 Beta 3 150000000 150000000

How it works

Sets the XID age at which VACUUM switches to an aggressive scan so it can advance a table’s relfrozenxid. It is a user-context setting.

An aggressive XID scan visits every page not already all-frozen and freezes eligible XIDs. PostgreSQL caps the effective value at 95% of autovacuum_freeze_max_age, leaving room for manual maintenance before forced anti-wraparound autovacuum.

Monitor age(relfrozenxid) and age(datfrozenxid), not relminmxid. The separate vacuum_multixact_freeze_table_age controls MXID-driven aggressive scans.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Set an XID aggressive-scan threshold that routine maintenance can reach and complete before autovacuum_freeze_max_age. Confirm full-table scan time on the largest relations.
OLAP Schedule aggressive XID freezing for static or newly loaded partitions while I/O headroom is available; lowering the threshold can spread work across maintenance windows.
Small nodes Keep the default and watch the oldest relfrozenxid in every database. Setting zero forces aggressive behavior for every VACUUM and is rarely appropriate globally.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.0–19 Beta 3 unmodified; OLAP: PG9.0–19 Beta 3 unmodified; CRIT: PG9.0–19 Beta 3 unmodified; TINY: PG9.0–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Monitoring relminmxid instead of the XID horizon relfrozenxid.
  • Setting a value above 95% of autovacuum_freeze_max_age and assuming PostgreSQL will use it unchanged.
  • Forcing aggressive scans too frequently on large mutable tables.
  • Waiting for forced anti-wraparound autovacuum instead of measuring routine full-scan completion time.

autovacuum_freeze_max_age · vacuum_freeze_min_age · vacuum_failsafe_age · vacuum_multixact_freeze_table_age · autovacuum · log_autovacuum_min_duration

References

30 - vacuum_max_eager_freeze_failure_rate

vacuum_max_eager_freeze_failure_rate — Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning. Observed in PG18–19 Beta 3; its last measured boot default is 0.03 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning.”

Identity

Type , Valuereal
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value01
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Freezing
Upstream classification
Latest boot value , Value0.03
0.03

Lifecycle

Fact Value
First observed PG18
Present in PG18–19 Beta 3
Removed in No
Introduction commit 052026c9b903 — Eagerly scan all-visible pages to amortize aggressive vacuum
Commit date 2025-02-11
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG18–19 Beta 3 0.03 0.03

How it works

Fraction of pages in a relation vacuum can scan and fail to freeze before disabling eager scanning. It can be changed at session scope, so different sessions may observe different behavior.

PG18 ordinary VACUUM may eagerly scan all-visible pages that are not all-frozen; it stops that extra work when the fraction scanned without successful freezing grows too high. Raising the rate can shrink later aggressive scans at the cost of more current I/O.

Monitor and change vacuum_max_eager_freeze_failure_rate together with vacuum_truncate, vacuum_freeze_table_age, autovacuum_freeze_max_age. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Calibrate vacuum_max_eager_freeze_failure_rate against the oldest XID/MXID age in every database and measured vacuum completion rate. Remove long transactions, stale slots, and blocked workers; never raise ages merely to hide a backlog.
OLAP Proactively VACUUM (FREEZE) newly loaded or static partitions in batch windows and reserve I/O time for full scans. Convert age budgets using peak transaction rate, not a wall-clock guess.
Small nodes Upstream defaults are usually safest. A small system still needs anti-wraparound maintenance; monitor every database, not only the application database.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG18–19 Beta 3 unmodified; OLAP: PG18–19 Beta 3 unmodified; CRIT: PG18–19 Beta 3 unmodified; TINY: PG18–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating the value as a percentage integer instead of a fraction between zero and one.
  • Raising it and increasing scans of all-visible pages without measuring added I/O and WAL.
  • Assuming eager freezing eliminates the need for periodic aggressive VACUUM.
  • Ignoring a table-level storage-parameter override.
  • Judging success only by pages scanned instead of pages actually frozen and future aggressive-scan work.

vacuum_truncate · vacuum_freeze_table_age · autovacuum_freeze_max_age · maintenance_work_mem · vacuum_failsafe_age · vacuum_freeze_min_age

References

31 - vacuum_multixact_failsafe_age

vacuum_multixact_failsafe_age sets the multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage. It is a user setting present in PG14–18; the latest recorded boot default is 1600000000.
Note

Fact — official short description: “Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value02100000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Freezing
Upstream classification
Latest boot value , Value1600000000
1600000000

Lifecycle

Fact Value
First observed PG14
Present in PG14–19 Beta 3
Removed in No
Introduction commit 1e55e7d1755c — Add wraparound failsafe to VACUUM.
Commit date 2021-04-07
Discussion thread 1 · thread 2

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG14–19 Beta 3 1600000000 1600000000

How it works

Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage. It can be changed at session scope, so different sessions may observe different behavior.

At the failsafe age, a running VACUUM prioritizes advancing the freeze horizon quickly: cost delays stop and optional work such as index cleanup and tail truncation is skipped. This is a last defense against wraparound outage, not a routine performance mode.

Monitor and change vacuum_multixact_failsafe_age together with autovacuum_freeze_max_age, vacuum_freeze_min_age, vacuum_freeze_table_age. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Calibrate vacuum_multixact_failsafe_age against the oldest XID/MXID age in every database and measured vacuum completion rate. Remove long transactions, stale slots, and blocked workers; never raise ages merely to hide a backlog.
OLAP Proactively VACUUM (FREEZE) newly loaded or static partitions in batch windows and reserve I/O time for full scans. Convert age budgets using peak transaction rate, not a wall-clock guess.
Small nodes Upstream defaults are usually safest. A small system still needs anti-wraparound maintenance; monitor every database, not only the application database.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG14–19 Beta 3 unmodified; OLAP: PG14–19 Beta 3 unmodified; CRIT: PG14–19 Beta 3 unmodified; TINY: PG14–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Treating failsafe as routine instead of an emergency.
  • Monitoring only XID age and missing MXID exhaustion.
  • Ignoring post-failsafe index cleanup debt.
  • Changing the global value while a table storage parameter overrides it.
  • Treating reltuples and cumulative change statistics as exact real-time counts.

autovacuum_freeze_max_age · vacuum_freeze_min_age · vacuum_freeze_table_age · vacuum_failsafe_age · autovacuum_multixact_freeze_max_age · vacuum_multixact_freeze_min_age

References

32 - vacuum_multixact_freeze_min_age

vacuum_multixact_freeze_min_age — Minimum age at which VACUUM should freeze a MultiXactId in a table row. Observed in PG9.3–19 Beta 3; its last measured boot default is 5000000 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Minimum age at which VACUUM should freeze a MultiXactId in a table row.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value01000000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Freezing
Upstream classification
Latest boot value , Value5000000
5000000

Lifecycle

Fact Value
First observed PG9.3
Present in PG9.3–19 Beta 3
Removed in No
Introduction commit fb47de2be6e4 — Separate multixact freezing parameters from xid’s
Commit date 2014-02-13
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.3–19 Beta 3 5000000 5000000

How it works

Sets the minimum MultiXact age at which VACUUM replaces old tuple xmax MultiXact IDs. It is a user-context setting and is distinct from the XID cutoff.

Lower values make VACUUM process MXIDs earlier; higher values defer that work. PostgreSQL may still remove MultiXacts proactively, and the effective cutoff is capped at half of autovacuum_multixact_freeze_max_age.

Track mxid_age(relminmxid), mxid_age(datminmxid), and pg_multixact member storage. Interpret it with vacuum_multixact_freeze_table_age, autovacuum_multixact_freeze_max_age, and vacuum_multixact_failsafe_age.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune from MXID consumption caused by row locks and multitransaction workloads. Preserve ample distance to autovacuum_multixact_freeze_max_age and monitor member storage as well as age.
OLAP Bulk reads alone rarely justify a change, but concurrent row-locking loaders can consume MXIDs quickly. Measure mxid_age and pg_multixact growth during the real load.
Small nodes Keep the default unless MXID evidence says otherwise. Low transaction volume does not protect a workload that creates many shared row locks.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.3–19 Beta 3 unmodified; OLAP: PG9.3–19 Beta 3 unmodified; CRIT: PG9.3–19 Beta 3 unmodified; TINY: PG9.3–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Describing the cutoff as an XID control or monitoring only relfrozenxid.
  • Ignoring pg_multixact member-space pressure, which can force aggressive work before the configured age.
  • Raising the value while long-lived shared row locks continue to generate old MXIDs.
  • Using autovacuum_freeze_max_age instead of the MultiXact-specific maximum when calculating the cap.

autovacuum_multixact_freeze_max_age · vacuum_multixact_freeze_table_age · vacuum_multixact_failsafe_age · vacuum_freeze_min_age · autovacuum · log_autovacuum_min_duration

References

33 - vacuum_multixact_freeze_table_age

vacuum_multixact_freeze_table_age — Multixact age at which VACUUM should scan whole table to freeze tuples. Observed in PG9.3–19 Beta 3; its last measured boot default is 150000000 in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Multixact age at which VACUUM should scan whole table to freeze tuples.”

Identity

Type , Valueinteger
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value02000000000
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Freezing
Upstream classification
Latest boot value , Value150000000
150000000

Lifecycle

Fact Value
First observed PG9.3
Present in PG9.3–19 Beta 3
Removed in No
Introduction commit fb47de2be6e4 — Separate multixact freezing parameters from xid’s
Commit date 2014-02-13
Discussion

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG9.3–19 Beta 3 150000000 150000000

How it works

Sets the MultiXact age at which VACUUM switches to an aggressive scan so it can advance a table’s relminmxid. It is a user-context setting.

An aggressive MXID scan visits every page not already all-frozen and processes eligible MultiXacts. PostgreSQL caps the effective value at 95% of autovacuum_multixact_freeze_max_age.

Monitor mxid_age(relminmxid), mxid_age(datminmxid), and pg_multixact storage. The XID horizon relfrozenxid is controlled by vacuum_freeze_table_age instead.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Choose an MXID threshold that leaves enough time to complete aggressive scans before autovacuum_multixact_freeze_max_age. Measure workloads with heavy shared row locking.
OLAP Most read-only analytics consume few MXIDs, but concurrent loaders can differ. Schedule scans from measured mxid_age and member-space growth rather than copying XID settings.
Small nodes Keep the default and monitor relminmxid/datminmxid. A small database can still consume MXIDs rapidly through row-locking patterns.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG9.3–19 Beta 3 unmodified; OLAP: PG9.3–19 Beta 3 unmodified; CRIT: PG9.3–19 Beta 3 unmodified; TINY: PG9.3–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Monitoring relfrozenxid instead of the MultiXact horizon relminmxid.
  • Using autovacuum_freeze_max_age rather than autovacuum_multixact_freeze_max_age for the 95% cap.
  • Copying an XID-age policy into an MXID workload with a very different consumption rate.
  • Ignoring pg_multixact member-space pressure while age still appears comfortable.

autovacuum_multixact_freeze_max_age · vacuum_multixact_freeze_min_age · vacuum_multixact_failsafe_age · vacuum_freeze_table_age · autovacuum · log_autovacuum_min_duration

References

34 - vacuum_truncate

vacuum_truncate — Enables vacuum to truncate empty pages at the end of the table. Observed in PG18–19 Beta 3; its last measured boot default is on in PG19 Beta 3, with user context. This is a beta-snapshot fact and can change before PostgreSQL 19 GA.
Note

Fact — official short description: “Enables vacuum to truncate empty pages at the end of the table.”

Identity

Type , Valuebool
Upstream pg_settings type
Context , Valueuser
Settable by an ordinary user
Unit , Value
Raw unit
Range , Value
Raw limits in the last observed version
Enum values , Value
— for non-enum types
Category , ValueVacuuming / Default Behavior
Upstream classification
Latest boot value , Valueon
on

Lifecycle

Fact Value
First observed PG18
Present in PG18–19 Beta 3
Removed in No
Introduction commit 0164a0f9ee12 — Add vacuum_truncate configuration parameter.
Commit date 2025-03-20
Discussion thread 1

Default history

Measured PG9.0–19 Beta 3 boot defaults
Versions Raw boot_val Unit Human value
PG18–19 Beta 3 on on

How it works

Enables vacuum to truncate empty pages at the end of the table. It can be changed at session scope, so different sessions may observe different behavior.

At the end of VACUUM, PostgreSQL may take an ACCESS EXCLUSIVE lock and remove wholly empty pages from the physical tail of a table. Disabling truncation avoids that lock episode but leaves the file allocated for later reuse.

Monitor and change vacuum_truncate together with vacuum_max_eager_freeze_failure_rate, vacuum_freeze_table_age, autovacuum_freeze_max_age. Validate on the relevant server role and real workload, then use its user context to choose session change, reload, or restart; a historical boot default is not the current effective value.

Tuning advice

Tip

Advice. These are workload-specific starting points and must be validated with measurements.

Workload Guidance
OLTP Tune vacuum_truncate from table size, change rate, and maintenance SLA, using per-table thresholds for large/hot relations. Observe trigger intervals, dead tuples, and ANALYZE/VACUUM duration.
OLAP Run explicit ANALYZE/VACUUM after bulk loads instead of waiting only for proportional triggers; plan freezing and visibility-map advancement separately for append-only partitions.
Small nodes Start with upstream or the measured Pigsty matrix value. Fixed thresholds dominate on small tables; after changes, confirm worker and I/O headroom.

Pigsty

Values use the fixed 8-vCPU, 32-GiB, 100-GiB SSD fixture and render the current Pigsty templates for PG19 Beta 3; this does not assert current Pigsty support for that historical or beta release.

Template Effective value Versus upstream boot Source expression
OLTP Unmodified
OLAP Unmodified
CRIT Unmodified
TINY Unmodified
Caution

Advice — pending human review. Fact from the current Pigsty template projection: OLTP: PG18–19 Beta 3 unmodified; OLAP: PG18–19 Beta 3 unmodified; CRIT: PG18–19 Beta 3 unmodified; TINY: PG18–19 Beta 3 unmodified. No Pigsty-specific rationale is inferred from an absent override.

Common pitfalls

  • Assuming truncation removes empty pages in the middle of a relation; only a contiguous empty tail can be removed.
  • Ignoring the ACCESS EXCLUSIVE lock attempt and blocking latency on a busy table.
  • Disabling truncation and expecting the operating system file size to shrink anyway.
  • Forgetting a table-level vacuum_truncate storage parameter can override the session/global value.
  • Relying on truncation during wraparound failsafe, when VACUUM can skip it to finish sooner.

vacuum_max_eager_freeze_failure_rate · vacuum_freeze_table_age · autovacuum_freeze_max_age · maintenance_work_mem · autovacuum · autovacuum_analyze_scale_factor

References