PostgreSQL 18 Turns a Year of Development into a Defined Release

PostgreSQL 18 was released on September 25, 2025. The release is a collection of changes that touch performance, indexing, security, and developer ergonomics. Below is a tour of the notable additions, organized by what they do rather than by release-note category.

Faster I/O and Smarter Index Access

The new asynchronous I/O subsystem lets Postgres issue multiple reads concurrently instead of waiting on each one serially. Before trying it, set the I/O method in your configuration:

1

2

SET io_method = 'io_uring';

SELECT * FROM pg_aios;  -- uses async I/O activity for speed

Indexing also gets a flexibility boost. Skip-scan enables Postgres to use a multicolumn index even when the leading column is absent from the query predicate. This removes the need to maintain a second index solely for queries that filter on the trailing columns. To test it, build a table with a multicolumn index first:

1

2

CREATE INDEX idx_flight ON winds(direction, speed);

SELECT * FROM winds WHERE speed > 20;

GIN indexes now support parallel builds, which should shorten index creation time on large text-heavy tables:

1

CREATE INDEX gin_idx ON notes USING gin(to_tsvector('english', entry));

Time-Ordered Identifiers and Richer UPDATE Visibility

UUIDv7 generates time-ordered identifiers, which makes them friendlier for index insertion patterns than purely random UUIDs. Ensure UUID support is enabled before using it:

1

SELECT uuidv7();

The RETURNING clause has been extended for UPDATE statements to expose both the previous and the new row values in a single result. That makes it straightforward to log changes or compute deltas between the old and new state of a row:

1

2

3

UPDATE flight SET destination = 'nest'

WHERE id = 1

RETURNING OLD.destination, NEW.destination;

The same capability is useful with PostGIS, for example to measure displacement after an update:

1

2

UPDATE bird SET position = 'SRID=4326;POINT(12 45)'

RETURNING st_distance(OLD.position, NEW.position);

Cheaper Performance Diagnostics

EXPLAIN (ANALYZE) now reports buffer usage by default. Buffer counts previously required an extra option like BUFFERS; in PostgreSQL 18 they appear automatically in the plan output, so a plain EXPLAIN (ANALYZE) is enough to gauge per-node I/O activity:

1

EXPLAIN (ANALYZE) SELECT * FROM practice;

Security and Authentication Updates

Authentication can now be delegated to OAuth 2.0 token validation. The feature is configured at the login level in pg_hba.conf rather than through SQL statements.

For regulated environments, pgcrypto gains a parameter, pgcrypto.builtin_crypto_enabled, that switches its internal cryptographic routines into FIPS-aware mode. Set it to fips when OpenSSL is running in FIPS mode; this is configuration, not an SQL execution change.

PostgreSQL 18 introduces wire protocol v3.2, a foundation for future client-server enhancements. libpq still defaults to v3.0, so existing clients keep working unchanged. Driver and proxy maintainers can add v3.2 support gradually to prepare for later protocol features.

Operational Improvements for Upgrades and Schema Changes

pg_upgrade now preserves optimizer statistics across major version upgrades. After preparing both clusters and running the upgrade, you avoid the usual post-upgrade statistics-gathering step:

1

pg_upgrade --old-datadir=/db/15 --new-datadir=/db/18 --old-bindir=/usr/pgsql-15/bin --new-bindir=/usr/pgsql-18/bin --link

Adding a NOT NULL constraint can now be done in two phases when nullable data is already present: add it NOT VALID first, then validate later when convenient. That avoids blocking writes during the initial constraint addition:

1

ALTER TABLE practice ADD CONSTRAINT nn_attempt NOT NULL attempt NOT VALID;

What Stands Out

The headline items are strong: asynchronous I/O changes the shape of concurrent read workloads, UUIDv7 improves indexing for time-series-ish identifiers, and EXPLAIN output gets better with no extra typing. The quieter changes — parallel GIN builds, retained stats across upgrades, deferred constraint validation — reduce operational friction in ways that matter during routine maintenance.