PostgreSQL 19: 5 production changes to test before the September 2026 GA

The five PostgreSQL 19 changes that will actually alter production behaviour, and how to test each before you upgrade.

Read time
15 min
Word count
2.3K
Sections
11
FAQs
8
Share
Editorial illustration of a database engine with data pipelines and a graph-node network.
PostgreSQL 19 brings online REPACK, self-scaling async I/O and native SQL/PGQ graph queries.
On this page · 11 sections
  1. What shipped, and when
  2. The 5 production changes worth testing
  3. PostgreSQL 18 to 19: what changes for operators
  4. The quiet breaking changes
  5. Read-your-writes on replicas: WAIT fOR LSN
  6. Logical replication and upgrades
  7. A test plan before you upgrade
  8. India-specific considerations
  9. How eCorpIT can help
  10. FAQ
  11. References

Summary. PostgreSQL 19 reached beta 2 on 16 July 2026, six weeks after beta 1 on 4 June 2026, and the feature set is now frozen ahead of a general-availability release the PostgreSQL Global Development Group expects around September or October 2026. Five changes matter more than the headline graph-query feature: the new REPACK ... CONCURRENTLY command for online table rebuilds, async I/O that scales its own worker pool through io_min_workers and io_max_workers, parallel autovacuum, a pg_plan_advice extension that pins query plans, and native SQL/PGQ property graph queries. PostgreSQL 19 also reports up to 2x faster inserts when foreign-key checks are present, and it ships two defaults that will quietly change query timings: JIT is now off by default and TOAST compression defaults to lz4. Amazon RDS already offers beta 1 in its Database Preview Environment, so you can test on a managed instance for a few dollars an hour rather than standing up your own. For most teams the real work is not the upgrade command, it is validating that these five behaviours help your workload instead of surprising it. This guide covers what each change does, the config that controls it, and a concrete test plan.

What shipped, and when

PostgreSQL follows a yearly major-release cadence, and version 19 is on schedule. Beta 1 arrived on 4 June 2026 and beta 2 on 16 July 2026. Beta 2 is a stabilisation release: it fixes a REPACK worker that was not cleaned up on a FATAL exit, corrects several SQL/PGQ property-graph bugs, and repairs an autovacuum multixact-age score that could grow to infinity. General availability is expected around September or October 2026, so the window to test against a frozen feature set is open now.

You do not need to compile from source to try it. Amazon Web Services made beta 1 available in the RDS Database Preview Environment, which lets you evaluate the release on a fully managed instance. Managed PostgreSQL still bills the way it always has: entry-level instances cost in the low tens of dollars per month, while large production fleets run into four and five figures monthly, and AWS positions its Graviton-based classes such as db.m7g as the price-performance option (see Amazon RDS pricing). If you run your own clusters, the upgrade path is unchanged: pg_upgrade, or pg_dump and pg_restore, or logical replication.

One caution before the details. This is beta software. The PostgreSQL project advises against running beta builds in production, and asks instead that you run typical application workloads against a copy so bugs surface before GA. Everything below is worth testing now; none of it is worth shipping to customers yet.

The 5 production changes worth testing

The release notes list dozens of improvements. These five are the ones most likely to change how your database behaves under real load.

Change What it replaces or improves How to test it
REPACK ... CONCURRENTLY The pg_repack extension and blocking VACUUM FULL Bloat a test table, run REPACK CONCURRENTLY, watch locks and disk
Self-scaling async I/O Fixed io_workers count from PostgreSQL 18 Set io_min_workers/io_max_workers, read EXPLAIN (ANALYZE, IO)
Parallel autovacuum Single-process autovacuum per table Set autovacuum_max_parallel_workers, load a wide table, watch pg_stat_progress_vacuum
pg_plan_advice Manual pg_hint_plan hints and planner GUCs Capture a good plan, stash advice, force a bad plan, confirm it holds
SQL/PGQ graph queries A separate graph database for relationship queries Define a property graph over existing tables, run GRAPH_TABLE

1. Online table rebuilds with REPACK CONCURRENTLY

For years, reclaiming bloat from a heavily updated table meant one of two bad options: VACUUM FULL, which takes an ACCESS EXCLUSIVE lock and blocks the table for the duration, or the third-party pg_repack extension, which works online but adds an operational dependency you have to build, install and trust. PostgreSQL 19 folds the online path into core with the new `REPACK` command and its non-blocking CONCURRENTLY option.


            -- Rebuild a bloated table without a long exclusive lock
REPACK CONCURRENTLY orders;

-- Rebuild and order the heap by an index's key
REPACK CONCURRENTLY orders USING INDEX orders_created_at_idx;
          

REPACK CONCURRENTLY rebuilds the table with much less operational overhead than VACUUM FULL, so writes can continue while it runs. Test it on a table you have deliberately bloated: delete a large fraction of rows, confirm the on-disk size with pg_total_relation_size, run the repack, and watch pg_stat_activity and pg_locks to confirm the exclusive lock window is short. Beta 2 specifically fixed a case where the repack worker was not cleaned up after a FATAL exit, which is exactly the kind of edge case worth exercising on a copy before you rely on it.

The plain point: if you carry pg_repack today only to avoid downtime, PostgreSQL 19 may let you drop the extension.

2. Async I/O that scales its own worker pool

PostgreSQL 18 introduced an asynchronous I/O subsystem. Its weakness was that io_method=worker used a fixed number of I/O workers you had to size by hand. PostgreSQL 19 makes that pool elastic: it automatically scales the worker count between the new `io_min_workers` and io_max_workers bounds based on demand.


            # postgresql.conf
io_method = worker
io_min_workers = 3
io_max_workers = 12
          

The observability side improved to match. EXPLAIN ANALYZE now surfaces async I/O statistics through its IO option, so you can see how a query actually used the AIO subsystem rather than guessing:


            EXPLAIN (ANALYZE, IO) SELECT * FROM events WHERE created_at > now() - interval '7 days';
          

If you already tuned async I/O for PostgreSQL 18, our PostgreSQL 18 async I/O and uuidv7 migration notes are the baseline to compare against. Run the same read-heavy query on 18 and 19, capture EXPLAIN (ANALYZE, IO) on both, and check whether the elastic pool reduces I/O wait without over-committing worker processes on a busy host.

3. Maintenance that keeps up: parallel autovacuum

On large, write-heavy tables, single-process autovacuum can fall behind faster than it catches up, and bloat and transaction-ID pressure build. PostgreSQL 19 lets autovacuum use parallel workers, controlled by the new `autovacuum_max_parallel_workers` setting, and adds a scoring system that prioritises which tables to vacuum first. A further change reduces future work by marking pages as all-visible while they are being queried.


            # postgresql.conf
autovacuum_max_parallel_workers = 4
          

Test this on a wide table with many indexes, since index cleanup is where parallelism helps most. Load it, generate dead tuples, and watch the pg_stat_progress_vacuum view. That view gained a started_by column that reports who initiated the operation and a mode column that reports how vacuum is running, both of which make it easier to tell manual and automatic runs apart during a test.

4. Plan stability you can control: pg_plan_advice

Every team that runs PostgreSQL at scale has hit a plan regression: a query that ran on an index scan for months suddenly flips to a sequential scan after a statistics change, and latency spikes. The usual answers are the third-party pg_hint_plan, or twisting planner GUCs like enable_seqscan for the whole session. PostgreSQL 19 adds a first-party option: the `pg_plan_advice` extension lets you stabilise and control planner decisions, and the companion pg_stash_advice applies stored advice automatically using query identifiers.

The test that matters is the regression drill. Capture a query while it has the plan you want, stash the advice, then force conditions that would normally push the planner to a worse plan, and confirm the advice holds it in place. This is the kind of control that turns a 2 a.m. incident into a config line.

Christophe Pettus, CEO of the PostgreSQL consultancy PGX, argues that the operational changes, not the marquee ones, are what to watch: "The PG19 changes most likely to affect production behavior are not the headline features. The quiet flip of jit = off by default will change query plans and timings for analytics workloads that were silently benefiting (or suffering) from JIT compilation. The 64-bit MultiXactOffset finally retires the 4-billion-member wraparound risk that has bitten busy multi-row-locking workloads."

5. Native graph queries with SQL/PGQ

The headline developer feature is SQL/PGQ, the SQL-standard property-graph syntax. It lets you run graph pattern queries over your existing relational tables, without a separate graph database and without migrating data. You define a property graph that maps vertices and edges onto tables you already have, then query it with GRAPH_TABLE.


            -- Define a property graph over existing tables
CREATE PROPERTY GRAPH social
  VERTEX TABLES ( users )
  EDGE TABLES (
    follows SOURCE KEY (follower_id) REFERENCES users (id)
            DESTINATION KEY (followee_id) REFERENCES users (id)
  );

-- Find who a user follows, two hops out
SELECT * FROM GRAPH_TABLE ( social
  MATCH (a)-[:follows]->(b)-[:follows]->(c)
  WHERE a.handle = 'manu'
  COLUMNS (c.handle AS reaches)
);
          

Treat this as beta syntax and confirm it against the PostgreSQL 19 docs for your build, because beta 2 shipped several SQL/PGQ fixes and details can still shift before GA. The honest engineering question is scope: SQL/PGQ handles relationship queries that were awkward in plain SQL, but it is not a full replacement for a specialised engine like Neo4j on deep, high-fan-out traversals. The same "keep it in Postgres" logic that we walk through for vectors in pgvector versus a dedicated vector database applies here: if your graph workload is moderate and already lives next to your relational data, one database is cheaper to run than two.

PostgreSQL 18 to 19: what changes for operators

Operation PostgreSQL 18 PostgreSQL 19
Online table rebuild pg_repack extension or blocking VACUUM FULL Core REPACK ... CONCURRENTLY
Async I/O workers Fixed io_workers count Self-scaling io_min_workers to io_max_workers
Autovacuum Single process per table Parallel workers via autovacuum_max_parallel_workers
Plan control pg_hint_plan or planner GUCs pg_plan_advice and pg_stash_advice
Graph queries External graph database Native SQL/PGQ GRAPH_TABLE
JIT On by default Off by default

The quiet breaking changes

The features get the headlines; the default changes cause the surprises. PostgreSQL 19 disables just-in-time compilation by default, which will change plans and timings for analytics queries that were tuned around JIT on version 18. It also switches default_toast_compression to lz4, which improves compression and decompression performance but changes the storage profile of large values. Support for RADIUS authentication is removed. A successful md5 login now emits a deprecation warning, controllable through md5_password_warnings, as the project continues to steer users towards SCRAM. And, as Pettus notes, the move to a 64-bit MultiXactOffset retires a wraparound risk that has bitten busy locking workloads.

Setting or feature PostgreSQL 18 default PostgreSQL 19
jit on off
default_toast_compression pglz lz4
RADIUS authentication Supported Removed
md5 authentication No warning Warning after successful login
Data checksums Set at initdb Can be toggled online without restart

Test the JIT change first, because it is the one most likely to move a latency number on day one. Run your slowest analytics queries with jit = on and jit = off and compare, then decide per workload rather than accepting the new default blindly.

Read-your-writes on replicas: WAIT fOR LSN

If you route reads to replicas, you have met replication lag: a user writes a row on the primary, then reads a replica that has not caught up, and the row appears to vanish. PostgreSQL 19 adds the `WAIT FOR LSN` command, which lets a session pause until the replica has replayed changes up to a specific log sequence number before it runs a SELECT.

René Cannaò, founder and CEO of ProxySQL, describes the pattern it removes: "PostgreSQL 19 is introducing a feature that will eliminate a lot of messy backend workarounds: WAIT FOR LSN. Historically, developers have thrown brittle hacks at this, like application sleep timers or forcing all post-write reads back to the primary database. With Postgres 19, read replicas can natively pause a session until they are perfectly caught up to a specific write."

If your application layer carries any of those sleep-and-retry hacks today, this is a chance to delete code. Test the write-then-read path against a lagging replica and confirm the read blocks correctly rather than returning stale data.

Logical replication and upgrades

Three logical-replication changes make major-version upgrades and migrations less painful. Logical replication now replicates sequence values, which removes the manual reconciliation step that used to bite teams during cutovers. You can enable logical replication without restarting the server, even when wal_level is set to replica, and a new read-only effective_wal_level parameter reports the level currently in effect. New CREATE PUBLICATION ... EXCEPT and CREATE SUBSCRIPTION ... SERVER syntax simplify publishing all-but-a-few tables and managing credentials through a foreign server.

For teams weighing self-managed against managed PostgreSQL during an upgrade, the trade-offs we lay out in Azure HorizonDB versus Flexible Server still hold: managed services shorten the upgrade to a control-plane action but lag the community release, while self-managed clusters get PostgreSQL 19 the day it ships at the cost of doing the upgrade yourself.

A test plan before you upgrade

Beta testing is only useful if it mirrors your workload. A pragmatic sequence:

  1. Restore a recent production snapshot into a PostgreSQL 19 instance, on Amazon RDS Preview or a local build.
  1. Replay a representative query set and capture EXPLAIN (ANALYZE, IO) for the slowest 20 queries on both 18 and 19.
  1. Flip jit and default_toast_compression explicitly and compare latency and storage.
  1. Bloat a large table, run REPACK CONCURRENTLY, and measure the lock window and disk reclaimed.
  1. Set autovacuum_max_parallel_workers, drive dead tuples on a wide table, and watch pg_stat_progress_vacuum.
  1. Run the pg_plan_advice regression drill on your two or three most plan-sensitive queries.
  1. If you use replicas, test WAIT FOR LSN on your write-then-read paths.

Mark Callaghan, a well-known database benchmarker, ran the insert benchmark on a small server and reported that "Postgres continues to be boring in a good way. It is hard to find performance regressions." Boring is the goal. Your job in the beta window is to confirm it is boring for your workload specifically.

India-specific considerations

For Indian teams, two points stand out. First, availability: managed PostgreSQL 19 will reach the India regions of the major clouds on each provider's own schedule, which usually trails the community GA, so plan self-managed testing if you need version 19 the moment it lands. Second, compliance. PostgreSQL 19 lets you enable or disable data checksums online without a restart, which makes it easier to turn on integrity checking for regulated data without a maintenance window. The Digital Personal Data Protection Act, 2023 pushes financial and health workloads towards demonstrable data integrity and controlled access, and features like online checksums and the md5 deprecation warnings support that direction. Our DPDP engineering playbook for Indian startups covers where database controls fit into a wider compliance programme. Budget realistically: a careful major-version upgrade for a large fleet is measured in engineering weeks, not an afternoon, and the migration testing is the bulk of that cost, not the upgrade command.

How eCorpIT can help

eCorpIT is a Gurugram-based engineering organisation with senior-led database and backend teams that plan and run PostgreSQL upgrades for production systems. We design upgrade paths aligned with DPDP requirements, build the test harness that replays your workload against a beta build, and de-risk changes like the JIT default flip before they reach customers. If you are scoping a PostgreSQL 18 to 19 move or evaluating whether SQL/PGQ can retire a separate graph database, contact us to talk through your workload.

FAQ

References

  1. PostgreSQL 19 Beta 2 Released, PostgreSQL Global Development Group, 16 July 2026
  1. PostgreSQL 19 Beta 1 Released and feature highlights, 4 June 2026
  1. PostgreSQL 19 release notes
  1. SQL/PGQ property graphs documentation, PostgreSQL 19
  1. REPACK command documentation, PostgreSQL 19
  1. io_min_workers and I/O resource configuration, PostgreSQL 19
  1. pg_plan_advice extension documentation, PostgreSQL 19
  1. autovacuum_max_parallel_workers documentation, PostgreSQL 19
  1. WAIT FOR LSN documentation, PostgreSQL 19
  1. PostgreSQL 19 Beta Introduces SQL Graph Queries and Concurrent Table Repacking, InfoQ, 16 June 2026
  1. PostgreSQL 19 Beta 1 in the Amazon RDS Database Preview Environment, AWS, June 2026
  1. Amazon RDS pricing

_Last updated: 23 July 2026._

Frequently asked

Quick answers.

01 What is new in PostgreSQL 19 compared with 18?
The main additions are online REPACK CONCURRENTLY table rebuilds, self-scaling async I/O, parallel autovacuum, the pg_plan_advice extension for plan stability, and native SQL/PGQ graph queries. Inserts run up to 2x faster with foreign-key checks, and defaults change: JIT is off and TOAST compression uses lz4.
02 When is PostgreSQL 19 general availability?
The PostgreSQL Global Development Group expects general availability around September or October 2026, following the project's yearly major-release cadence. Beta 1 shipped on 4 June 2026 and beta 2 on 16 July 2026 with the feature set frozen. The project advises testing now but not running beta builds in production.
03 Does PostgreSQL 19 replace pg_repack?
For many teams, yes. The new core REPACK command with its non-blocking CONCURRENTLY option rebuilds bloated tables online with less operational overhead than VACUUM FULL, and without the third-party pg_repack extension. If you run pg_repack today only to avoid downtime, PostgreSQL 19 may let you drop that dependency after testing.
04 What does SQL/PGQ do, and do I still need a graph database?
SQL/PGQ adds SQL-standard property-graph queries over your existing tables through the GRAPH_TABLE syntax, so relationship queries run inside PostgreSQL without a separate engine or data migration. For moderate graph workloads that live beside relational data, one database is cheaper. Deep, high-fan-out traversals may still favour a specialised graph engine.
05 Is JIT still on by default in PostgreSQL 19?
No. Just-in-time compilation is now off by default in PostgreSQL 19, a change from PostgreSQL 18. This can alter plans and timings for analytics queries that were tuned with JIT enabled. Test your slowest analytical queries with jit = on and jit = off and decide per workload rather than accepting the default.
06 Can I test PostgreSQL 19 on a managed service?
Yes. Amazon Web Services made PostgreSQL 19 beta 1 available in the RDS Database Preview Environment, so you can evaluate it on a fully managed instance rather than compiling from source. Managed PostgreSQL bills as usual, from the low tens of dollars per month for small instances up to four and five figures for large production fleets.
07 What is WAIT FOR LSN used for?
WAIT FOR LSN lets a database session pause until a replica has replayed changes up to a specific log sequence number before running a query. It supports read-your-writes patterns on replicas and removes brittle application workarounds like sleep timers or forcing every post-write read back to the primary database.
08 Should I upgrade to PostgreSQL 19 in production now?
Not yet. PostgreSQL 19 is in beta, and the project advises against running beta builds in production. Use the window before the September or October 2026 GA to restore a production snapshot, replay your workload, and test the five changes and the default flips so the upgrade holds no surprises on GA day.

About the author

Manu Shukla

Founder & Director

Founder of eCorpIT. Hands-on engineer leading senior-only delivery for AI apps, custom software, and cloud systems for global clients.

Subscribe

One engineering note a week. No fluff, no spam.

Senior-architect playbooks on AI agents, mobile apps, cloud, security, data, and marketing — delivered every Wednesday.

Past the reading

Read enough. Let's build something.

A senior architect responds in 24 working hours with scope, indicative cost, and a timeline. NDA before any technical conversation.