PostgreSQL

PostgreSQL

All Your GUCs in a Row: io_combine_limit and io_max_combine_limit

We now enter the io_* neighborhood, the newest one in the GUC namespace: nothing here existed before PostgreSQL 17. If effective_io_concurrency answers “how many I/Os do we keep in flight?”, io_combine_limit answers the orthogonal question: “how big is each one?” Depth and width.

io_combine_limit arrived in PostgreSQL 17. The default is 128kB (16 blocks; unitless values are in BLCKSZ

All Your GUCs in a Row: IntervalStyle

IntervalStyle is DateStyle’s younger sibling, and it inherited the family trait: it looks like an output-formatting preference, but it also changes how PostgreSQL parses your input. We covered the date version of this trick in DateStyle. The interval version is less famous and, in one specific case, nastier.

The default is postgres, the context is user

All Your GUCs in a Row: integer_datetimes

Every connection anyone has made to a PostgreSQL server since 8.0 has opened with the server announcing, unprompted, the value of integer_datetimes. Since PostgreSQL 10, the value it announces is the only value a PostgreSQL server can be built with, and the current documentation disposes of the entire subject in one sentence: “As of PostgreSQL 10, this is always

All Your GUCs in a Row: in_hot_standby

in_hot_standby is a light, not a switch. It reports whether the server you are connected to is currently a hot standby: on when your session is riding a replica that is replaying WAL and taking read-only queries (the state hot_standby enables), off on a primary. It is a boolean, it arrived in PostgreSQL 14, and its context is none of

All Your GUCs in a Row: ignore_system_indexes

ignore_system_indexes completes a run of three consecutive parameters named ignore_-something, and it is by a comfortable margin the most polite of the family. ignore_checksum_failure and ignore_invalid_pages tell PostgreSQL to proceed past evidence of corruption; this one just tells it to stop trusting a set of access paths. It is a boolean, default off, and it lives in the

All Your GUCs in a Row: ignore_invalid_pages

Nobody finds ignore_invalid_pages by reading the documentation front to back. You find it by pasting PANIC: WAL contains references to invalid pages into a search engine, generally at an hour when you would prefer to be asleep. It is a developer option, absent from postgresql.conf.sample, present since PostgreSQL 13. The default is off and the context is postmaster,

All Your GUCs in a Row: ignore_checksum_failure

ignore_checksum_failure is not a configuration parameter so much as a crowbar in a glass case. It defaults to off, it does not appear in postgresql.conf.sample at all (the sample file politely declines to advertise it), and the documentation files it under Developer Options, next to the other tools you hope never to hold. The context is superuser, which

Ontogeny Recapitulates the Relcache

Jacob Jackson at ByteofDev built something I can only describe as admirably irresponsible (and something I wish I had thought of first): claudegres, a “PostgreSQL” in which Claude is the entire backend. Not Claude tuning the database, and not Claude writing queries against the database. Claude as the database: parsing SQL, planning queries, formatting result sets, and persisting heap

All Your GUCs in a Row: idle_session_timeout

idle_session_timeout is housekeeping, not protection. Its sibling, idle_in_transaction_session_timeout, defends the database from actual harm: an idle transaction holds locks and pins the xmin horizon, and vacuum suffers for it. A session idle outside a transaction does none of that. It ties up a connection slot, a backend process, and some memory. That is the entire bill, and this parameter

All Your GUCs in a Row: idle_replication_slot_timeout

idle_replication_slot_timeout shares an alphabetical neighborhood with idle_in_transaction_session_timeout and idle_session_timeout, but it solves the opposite problem. Those disconnect clients that stay too long. This one, new in PostgreSQL 18, deals with clients that stop showing up at all: it puts an expiration date on replication slots.

A replication slot is an open-ended promise. As long as the slot exists,