PostgreSQL 18: performance gains need production evidence
Asynchronous I/O, skip scans and better upgrade behaviour are compelling. The right migration starts with workload evidence and a rehearsed rollback.

PostgreSQL 18 introduced one of the database's most consequential performance changes in years: an asynchronous I/O subsystem. It can queue multiple reads instead of waiting for each operation in sequence, benefiting sequential scans, bitmap heap scans and vacuum. The release also added skip-scan support for multicolumn B-tree indexes, uuidv7(), virtual generated columns and more detailed execution statistics.
The headline is speed. The engineering question is whether a specific production workload becomes faster, safer and easier to operate.
Begin with waits, not features
Before changing a major database version, capture a representative baseline. Record latency distributions for important transactions, throughput, query plans, buffer activity, I/O waits, vacuum behaviour, replication lag and recovery objectives.
This separates workloads that may benefit from asynchronous reads from those limited by locks, poor query shape, network calls or application behaviour. A database upgrade cannot rescue an N+1 query or an unnecessarily broad transaction.
PostgreSQL 18 makes EXPLAIN ANALYZE more informative, including buffer access by default and further detail around index lookups. Use that evidence to test hypotheses, not to tune every query visible in a dashboard.
Treat defaults as deliberate changes
New clusters created by PostgreSQL 18 enable data checksums by default. The release also deprecates MD5 password authentication in favour of SCRAM and introduces OAuth authentication support. These are welcome changes, but they affect upgrade planning, clients and operational documentation.
Inventory drivers, poolers, extensions, backup tooling and monitoring before the rehearsal. Confirm that the team knows which settings are inherited, which are new and which need explicit tuning. Avoid copying an old configuration wholesale into a new major version.
Rehearse the whole migration
A credible rehearsal uses a recent, production-shaped dataset and the same extension set as the target environment. Measure the upgrade, post-upgrade analysis, cache warm-up and application verification—not just the database command.
Build a short acceptance pack:
- critical queries return the same results;
- latency and throughput remain within agreed bounds;
- backups restore and point-in-time recovery works;
- replicas and failover behave as expected;
- monitoring, alerts and runbooks reflect PostgreSQL 18;
- rollback criteria are clear before the maintenance window begins.
PostgreSQL 18 preserves optimizer statistics during pg_upgrade, which can reduce the unstable period after an upgrade. It does not remove the need to test with the application and real access patterns.
Tune asynchronous I/O with care
The new io_method setting supports different approaches, including worker-based I/O and io_uring where available. The right choice depends on operating system support, storage and hosting constraints. Establish a controlled benchmark, change one meaningful variable at a time and keep the synchronous path as a comparison.
The best upgrade result is not the largest synthetic number. It is predictable production performance, simpler operations and an evidence-backed reason to keep the change.