Skip to main content

PostgreSQL 19 beta dropped last week, and it is one of the most feature-dense releases the project has ever shipped. From native graph queries to zero-downtime table maintenance, this release addresses real pain points that development teams have been working around for years.

If PostgreSQL is anywhere in your stack — and statistically, it probably is — here is what you need to pay attention to.

TL;DR

  • SQL/PGQ brings native graph queries to PostgreSQL — no extensions, no new query language, just SQL
  • REPACK CONCURRENTLY eliminates the access-exclusive lock that made VACUUM FULL a production nightmare
  • Parallel autovacuum finally lets Postgres clean up after itself without choking single-core
  • Async I/O and SIMD-accelerated COPY FROM deliver measurable throughput gains on modern hardware
  • Logical replication now syncs sequences — closing one of the last gaps for zero-downtime migrations
  • Online checksum toggling removes the last excuse for running without data integrity checks

Native Graph Queries Land in SQL

The headline feature is SQL/PGQ — SQL Property Graph Queries. This is not a bolted-on extension or a separate query language. PostgreSQL 19 implements the ISO SQL/PGQ standard, letting you define property graphs over your existing relational tables and query them with standard SQL path patterns.

Why does this matter? Because graph-shaped problems are everywhere in business applications — fraud detection, recommendation engines, supply chain mapping, organisational hierarchies — and until now, solving them in PostgreSQL meant either writing recursive CTEs that would make your eyes bleed or adding a separate graph database to your architecture.

With SQL/PGQ, you define a graph view over tables you already have, then write path-matching queries against it. The planner turns those graph patterns into standard relational query plans, which means they benefit from all the optimiser improvements PostgreSQL has accumulated over three decades. No new storage engine, no new index type, no new operational burden.

For teams already running Neo4j or Amazon Neptune alongside PostgreSQL just for graph queries, this is a serious reason to consolidate. One fewer database in your architecture means one fewer thing to secure, back up, monitor, and explain to the new hire.

REPACK CONCURRENTLY: The End of Maintenance Windows

Every PostgreSQL DBA has lived this nightmare: a table has bloated to three times its logical size, performance is degrading, and the only fix — VACUUM FULL — takes an access-exclusive lock that blocks every read and write for the duration. On a busy production table, that can mean minutes or hours of downtime.

PostgreSQL 19 introduces REPACK, a new command that unifies VACUUM FULL and CLUSTER into a single operation. More importantly, it supports REPACK CONCURRENTLY, which rebuilds the table using logical replication under the hood — no access-exclusive lock, no blocked queries, no maintenance window.

This was previously only possible through the third-party pg_repack extension, which required separate installation, had version compatibility concerns, and was not covered by PostgreSQL’s own release testing. Having it built into core means it is tested against every commit, documented in the official docs, and available everywhere PostgreSQL runs.

If your team has been scheduling weekend maintenance windows for table repacking, PostgreSQL 19 just gave you your weekends back.

Parallel Autovacuum Finally Arrives

Autovacuum has been PostgreSQL’s silent workhorse for years, but it has always been single-threaded per table. On large tables with hundreds of millions of rows, a single vacuum worker crawling through the heap is simply not fast enough to keep up with write-heavy workloads.

PostgreSQL 19 adds parallel autovacuum via two new configuration parameters: autovacuum_max_parallel_workers and a per-table autovacuum_parallel_workers storage parameter. This lets multiple workers process the same table simultaneously, dramatically reducing vacuum times on large tables.

Combined with the new autovacuum scoring system — which lets you weight freeze, multixact, insert, and analyse priorities — this gives teams far more granular control over how PostgreSQL allocates its housekeeping resources. The days of tuning autovacuum by adjusting autovacuum_vacuum_cost_delay and hoping for the best are numbered.

Performance: Death by a Thousand Optimisations

PostgreSQL 19 does not have a single flashy performance headline. Instead, it delivers dozens of targeted improvements that compound across real workloads.

Async I/O enhancements improve read-ahead scheduling for large sequential scans, with a new worker-based I/O method that automatically scales background workers based on demand. The new io_method, io_min_workers, and io_max_workers settings give you knobs without requiring you to understand the kernel’s AIO implementation.

SIMD-accelerated COPY FROM uses CPU vector instructions to parse CSV and text input, which matters enormously for data pipeline teams loading millions of rows. The same SIMD treatment extends to hex encoding, page checksums (AVX2), and CRC32C computation (ARM crypto extensions).

Query optimiser improvements are extensive: better anti-join conversion for NOT IN clauses, aggregate push-down before joins to reduce intermediate row counts, improved constant folding, and better hash join handling of NULL keys. These are the kinds of improvements that shave milliseconds off every query without anyone changing a line of application code.

Default TOAST compression has switched from pglz to lz4, which is significantly faster for both compression and decompression. If you have been manually setting lz4 on large text or JSONB columns, it is now the default.

One notable change: JIT compilation is now disabled by default. The PostgreSQL team found that JIT’s cost model was unreliable — it often kicked in for queries where compilation overhead exceeded execution savings. If your workload benefits from JIT, you will need to explicitly enable it.

Logical Replication Closes the Sequence Gap

Logical replication has been PostgreSQL’s answer to zero-downtime major version upgrades, blue-green deployments, and cross-version data migration. But it had a glaring hole: it could not replicate sequences. That meant after a logical replication migration, you had to manually sync every sequence value or risk primary key collisions.

PostgreSQL 19 fixes this with sequence synchronisation support in subscriptions. Publishers can now include sequences via ALL SEQUENCES in publications, and subscribers can refresh sequence values on demand. The new pg_get_sequence_data() function lets you inspect the current state.

This also brings improvements to the EXCEPT clause for publications (exclude specific tables from ALL TABLES), conflict tracking via retain_conflict_info, and automatic WAL level management that enables logical replication when wal_level = replica. The operational friction of setting up logical replication has dropped significantly.

Online Checksums and Security Hardening

Data checksums have been a best practice since PostgreSQL 9.3, but enabling them on an existing cluster required taking it offline and running pg_checksums. For large databases, that meant hours of downtime — which is exactly why many production clusters still run without checksums.

PostgreSQL 19 lets you enable and disable checksums online, removing the last excuse for running without data integrity verification. If you have been putting this off, now is the time.

Other security changes worth noting: RADIUS authentication has been removed entirely (it was UDP-only and insecure), MD5 password authentication now generates deprecation warnings, and standard_conforming_strings is permanently forced on — eliminating a class of SQL injection vulnerabilities that relied on backslash interpretation.

Temporal Queries and SQL Ergonomics

PostgreSQL 19 adds temporal query support with UPDATE ... FOR PORTION OF and DELETE ... FOR PORTION OF, enabling operations on specific segments of temporal ranges. This is critical for applications that model time-varying data — insurance policies, employment records, pricing tiers — where you need to modify a slice of a validity period without affecting the rest.

Other SQL quality-of-life improvements include GROUP BY ALL (automatically groups non-aggregate columns), window function IGNORE NULLS support, and INSERT ... ON CONFLICT DO SELECT ... RETURNING — a pattern that eliminates the need for a separate query when you want to get or create a row.

COPY TO now supports JSON output format, which simplifies data export pipelines that feed into downstream systems expecting JSON. The new ON_ERROR SET_NULL option for COPY FROM handles dirty data gracefully without aborting the entire import.

What This Means for Your Stack

PostgreSQL 19 is not a revolution — it is the kind of release that makes the case for PostgreSQL as a platform rather than just a database. Graph queries reduce the need for a separate graph database. REPACK CONCURRENTLY reduces the need for third-party maintenance tools. Parallel autovacuum reduces the need for custom vacuum scripts.

The pattern is clear: PostgreSQL keeps absorbing functionality that used to require additional infrastructure, additional tools, or additional expertise. For teams running on PostgreSQL, that is a compounding advantage.

Our recommendation: start testing against the beta now. Set up a PostgreSQL 19 instance, point your test suite at it, and identify any breaking changes early — particularly around JIT being disabled by default, the new default TOAST compression, and the behavioural change where json_array() returns an empty array instead of NULL.

If you are planning a major version upgrade or evaluating your database architecture, get in touch. Our team specialises in PostgreSQL migrations, performance tuning, and infrastructure planning — we can help you get the most out of what PostgreSQL 19 brings to the table.

Photo by Taylor Vick on Unsplash