PostgreSQL parameters
A plain-language tuning reference for the PostgreSQL settings that actually matter. Each page explains what the parameter does, how to pick a value, and shows a live recommendation computed in your browser by the same engine behind the configurator.
99 parameters documented so far — we add pages as we write them properly rather than auto-generating stubs.
Memory
autovacuum_work_memMemory each autovacuum worker may use (defaults to maintenance_work_mem).
hash_mem_multiplierGives hash-based operations more memory than plain work_mem.
huge_pagesWhether to back shared memory with OS huge pages (reduces TLB pressure).
maintenance_work_memMemory for maintenance operations: VACUUM, CREATE INDEX, ALTER TABLE … ADD FOREIGN KEY.
shared_buffersPostgreSQL's own cache of table and index pages in shared memory.
temp_buffersPer-session cache for temporary tables.
vacuum_buffer_usage_limitSize of the shared-buffer ring VACUUM and ANALYZE use, limiting cache eviction.
work_memMemory each sort, hash, and similar operation may use before spilling to disk.
WAL & checkpoints
bgwriter_delayHow often the background writer wakes to flush dirty pages.
bgwriter_lru_maxpagesHow many dirty pages the background writer may flush per round.
checkpoint_completion_targetHow much of the interval to spread checkpoint writes over, smoothing I/O.
checkpoint_timeoutMaximum time between automatic checkpoints.
commit_delayA tiny pause before flushing WAL so concurrent commits can share one flush (group commit).
max_wal_sizeSoft ceiling on WAL between automatic checkpoints — bigger means fewer checkpoints.
min_wal_sizeHow much WAL PostgreSQL recycles and keeps ready instead of deleting.
wal_buffersShared memory buffering WAL records before they're written to disk.
wal_compressionCompress full-page images written to WAL, shrinking WAL volume.
wal_keep_sizeMinimum WAL kept around so lagging standbys can still catch up.
wal_levelHow much information is written to WAL — gates replication and PITR.
wal_writer_delayHow often the WAL writer flushes WAL in the background.
Query planner
cpu_tuple_costThe planner's assumed CPU cost of processing one row.
default_statistics_targetHow much detail ANALYZE collects for column statistics.
effective_cache_sizeThe planner's estimate of total cache available (shared_buffers + OS cache).
effective_io_concurrencyHow many concurrent disk I/Os PostgreSQL will issue for prefetching.
enable_hashjoinDebug toggle that strongly discourages hash joins (default on).
enable_indexscanDebug toggle that strongly discourages index scans (default on).
enable_nestloopDebug toggle that strongly discourages nested-loop joins (default on).
enable_partitionwise_aggregateLets the planner aggregate each partition separately, then combine.
enable_partitionwise_joinLets the planner join matching partitions pair-by-pair instead of as whole tables.
enable_seqscanA debug toggle that strongly discourages — not forbids — sequential scans.
from_collapse_limitHow aggressively the planner merges sub-queries into the parent for join planning.
jitJust-in-time compilation of expressions for big analytical queries.
jit_above_costMinimum estimated query cost at which JIT compilation kicks in.
join_collapse_limitHow many tables the planner will reorder freely when searching for a join order.
maintenance_io_concurrencyConcurrent I/O for maintenance work like VACUUM prefetch.
random_page_costThe planner's assumed cost of a random disk page read vs a sequential one.
seq_page_costThe planner's baseline cost for reading one page sequentially.
Parallelism
max_parallel_maintenance_workersParallel workers a single maintenance op (e.g. CREATE INDEX) may use.
max_parallel_workersThe cluster-wide pool of parallel workers all queries draw from.
max_parallel_workers_per_gatherMaximum parallel workers a single query operation may request.
max_worker_processesThe hard ceiling on all background worker processes (parallelism, replication, extensions).
min_parallel_index_scan_sizeSmallest index portion to scan that justifies considering a parallel index scan.
min_parallel_table_scan_sizeThe smallest table scan size for which the planner considers going parallel.
parallel_setup_costThe planner's assumed fixed cost of starting parallel workers.
parallel_tuple_costThe planner's per-row cost of moving a row from a worker to the leader.
Autovacuum
autovacuumThe master switch for the background autovacuum daemon.
autovacuum_analyze_scale_factorFraction of a table that must change before autovacuum re-runs ANALYZE.
autovacuum_freeze_max_ageThe transaction-age at which a forced anti-wraparound vacuum must run.
autovacuum_max_workersHow many tables autovacuum can clean at the same time.
autovacuum_naptimeHow long the autovacuum daemon sleeps between checking for work.
autovacuum_vacuum_cost_delayHow long autovacuum sleeps after hitting its cost limit.
autovacuum_vacuum_cost_limitHow much I/O work autovacuum does before pausing — its throttle.
autovacuum_vacuum_insert_scale_factorTriggers vacuum on insert-heavy tables that have few dead rows.
autovacuum_vacuum_scale_factorFraction of a table that must change (dead rows) before autovacuum kicks in.
vacuum_cost_delayThe pause manual VACUUM takes after hitting vacuum_cost_limit (default 0 = no throttle).
vacuum_cost_limitThe cost budget for *manual* VACUUM — also the basis for autovacuum's own limit.
vacuum_freeze_min_ageHow old a row must be before a vacuum will freeze it.
vacuum_freeze_table_ageThe table age at which a normal vacuum escalates to a full-table freeze scan.
Connections
listen_addressesWhich network interfaces the server accepts TCP connections on.
max_connectionsHard cap on concurrent client connections.
max_prepared_transactionsEnables two-phase commit (PREPARE TRANSACTION) and caps how many can be pending.
password_encryptionThe algorithm used to store new role passwords — use SCRAM, not MD5.
sslEnables TLS for client connections.
Replication
archive_commandThe shell command that copies each completed WAL segment to durable storage.
archive_modeTurns on WAL archiving — the basis for point-in-time recovery and some backups.
archive_timeoutForces a WAL switch on a timer so low-traffic systems still archive regularly.
hot_standby_feedbackLets a read replica tell the primary not to vacuum rows its queries still need.
max_replication_slotsHow many replication slots can exist — slots guarantee WAL retention for consumers.
max_slot_wal_keep_sizeBounds how much WAL one replication slot may hold — guards against a dead consumer filling the disk.
max_wal_sendersHow many simultaneous replication connections (standbys, backups) are allowed.
synchronous_standby_namesNames the standbys that must confirm a commit for synchronous replication.
track_commit_timestampRecords the commit time of each transaction (used by conflict resolution and auditing).
Durability
fsyncWhether PostgreSQL forces data to physically reach disk — the master durability switch.
full_page_writesWrites a full copy of a page to WAL on its first change after a checkpoint, guarding against torn pages.
synchronous_commitHow long COMMIT waits for durability — the safe knob for trading a little durability for speed.
Logging & statistics
compute_query_idComputes a stable query identifier so tools and logs can group identical queries.
log_autovacuum_min_durationLogs autovacuum/autoanalyze actions that take longer than this.
log_checkpointsLogs each checkpoint with its timing and how many buffers it wrote.
log_connectionsLogs each successful new client connection.
log_destinationWhere PostgreSQL writes log lines — plain text, CSV, JSON, syslog, or Windows event log.
log_disconnectionsLogs each client disconnection, including session duration.
log_durationLogs the duration of every completed statement (without the statement text).
log_line_prefixThe template for what metadata prefixes each log line (time, PID, user, db…).
log_lock_waitsLogs a statement that waited longer than deadlock_timeout for a lock.
log_min_duration_statementLogs any statement that runs longer than this threshold — your slow-query log.
log_statementLogs statements by category — none, DDL only, data-modifying, or all.
log_temp_filesLogs temporary files above a size — a direct signal that work_mem is too small.
logging_collectorRuns a dedicated process that captures stderr and rotates log files.
shared_preload_librariesExtensions loaded at server start — required for pg_stat_statements, auto_explain, etc.
track_functionsCounts calls and time for functions, surfaced in pg_stat_user_functions.
track_io_timingMeasures actual time spent on disk reads/writes, shown in EXPLAIN and stats.
Timeouts & limits
deadlock_timeoutHow long to wait on a lock before checking whether a deadlock exists.
idle_in_transaction_session_timeoutTerminates sessions left idle inside an open transaction.
idle_session_timeoutCloses sessions that sit idle (not in a transaction) for too long.
lock_timeoutCaps how long a statement waits to acquire a lock before giving up.
max_locks_per_transactionSizes the shared lock table — raise it for partitioning-heavy workloads.
max_pred_locks_per_transactionSizes the predicate-lock table used by SERIALIZABLE isolation.
statement_timeoutAborts any single statement that runs longer than this — a runaway-query guard.
temp_file_limitCaps how much temporary file space one process may use before its query is aborted.