PostgreSQL

PostgreSQL

All Your GUCs in a Row: effective_io_concurrency

Most parameters that change across versions change their default. effective_io_concurrency is rarer: it has changed its meaning twice, and what it governs in PostgreSQL 18 is not what it governed in 17, which in turn was not what it meant before 13. A value you copied from a 2019 tuning guide into a modern cluster is not just stale

All Your GUCs in a Row: effective_cache_size

This is one of the most consistently misunderstood parameters PostgreSQL has, and the misunderstanding is always the same shape: people believe effective_cache_size does something to memory. It allocates a cache. It reserves RAM. It controls how much PostgreSQL keeps in memory. It does none of these. It allocates nothing, reserves nothing, and changes no runtime behavior whatsoever. It is

All Your GUCs in a Row: dynamic_shared_memory_type

dynamic_shared_memory_type picks the operating-system mechanism PostgreSQL uses for dynamic shared memory — memory allocated after startup, as opposed to the fixed shared_buffers region grabbed once at boot. The context is postmaster, so it’s a restart to change, and the default is chosen by initdb from what your platform supports: posix on Linux and most Unix, windows on Windows. You

All Your GUCs in a Row: dynamic_library_path

dynamic_library_path tells PostgreSQL where to look for a loadable C module when something — a CREATE FUNCTION ... LANGUAGE C, a LOAD, a shared_preload_libraries entry — names the library by a bare filename with no directory in it. The default is $libdir, the context is superuser, and for most of its life this was a parameter

All Your GUCs in a Row: default_transaction_isolation and default_transaction_read_only

The remaining two of the three default_transaction_* parameters, completing the set default_transaction_deferrable began. Each sets the session default for one of the three properties a transaction carries — isolation level, access mode, deferrability — and for all three the rule is the same: the GUC scope is rarely the one you want. The interesting content is what the values mean

All Your GUCs in a Row: default_transaction_deferrable

default_transaction_deferrable sets the default value of the DEFERRABLE transaction attribute for new transactions. The default is off, the context is user, and the attribute it defaults does nothing at all unless two other things are also true — which is what makes this parameter worth a few hundred words rather than a sentence.

All Your GUCs in a Row: default_toast_compression

default_toast_compression sets which algorithm PostgreSQL uses to compress values bound for TOAST — the out-of-line storage that holds field values too big to sit inline in an 8KB heap page. The choices are pglz and lz4; the default, on every released version as of today, is pglz; the context is user, and it can be overridden per

All Your GUCs in a Row: default_text_search_config

default_text_search_config names the text search configuration that PostgreSQL’s full-text-search functions use when you don’t hand them one explicitly. The default is set by initdb from the cluster’s locale; the context is user. A text search configuration bundles a parser (which breaks text into tokens) with a chain of dictionaries (which fold tokens into lexemes — stemming “running” to “run”,

All Your GUCs in a Row: default_tablespace

The mechanics first, because they’re brief: when default_tablespace is anything but an empty string, it supplies an implicit TABLESPACE clause for every CREATE TABLE and CREATE INDEX that lacks an explicit one — including the index behind a UNIQUE or PRIMARY KEY constraint. The default is the empty string, which means “use the database’s own tablespace,” and the context is

All Your GUCs in a Row: default_table_access_method

A small knob on a very large door. default_table_access_method names the table access method — the storage engine, to use the word everyone actually means — that new tables get when their CREATE TABLE doesn’t say otherwise. The default is heap. The context is user. And for the overwhelming majority of clusters, the value has never been anything