PostgreSQL 18 went GA yesterday. I ran the beta in July. Now it is not a preview, it is a ticket, and these are the notes from planning it.
The quiet feature that matters most for the upgrade itself: pg_upgrade now carries planner statistics over. Before, the minutes or hours after switching versions were the scary part. Fresh cluster, empty statistics, the planner guessing, production limping until ANALYZE finished. That cliff is mostly gone. This alone changes how a major upgrade feels at 2 a.m.
Skip scan is the feature I will be checking plans for. A multicolumn btree index can now serve queries that do not filter on the leading column, when that column has few distinct values. Some of our single-column indexes exist only as workarounds for exactly this. After the upgrade some of them may be deletable. May. The release notes do not know your data. EXPLAIN does. I will believe each deletion only after seeing the plan.
Async I/O and uuidv7() I already tested on the beta, both held up. New projects get v7 keys from day one. Migrating existing v4 keys is a separate, unpleasant conversation that no release solves for you.
Rollout, nothing original: a replica on 18, replay of real production queries, plan diffs on the top fifty statements, regression tests, then the switch. Not on a Friday.
And one number in the version string matters to me: .0. Staging runs 18.0 from Monday. Production waits for 18.1. Not because I expect disaster. Because waiting two months is free, and being early costs weekends. I have paid in weekends before.