
PostgreSQL 19 Beta 4 landed today, and the real story is not what’s new — it’s what survived. Across four beta rounds, the development team reverted 53 features, including heavily marketed headliners like SQL Property Graph Queries, MERGE/SPLIT PARTITIONS, and GROUP BY ALL. What remains is leaner but more trustworthy: three maintenance wins that will make on-call life noticeably better, a handful of sharp developer quality-of-life improvements, and a monitoring layer that finally earns the word “observability.” GA is targeting end of October.
The Three Features Worth Upgrading For
REPACK CONCURRENTLY
VACUUM FULL has been a production hazard for years. It works, but it takes an exclusive lock on your table for the duration — which means downtime or a maintenance window every time bloat gets out of hand. PostgreSQL 19 ships a built-in replacement:
REPACK TABLE orders CONCURRENTLY;
This does everything VACUUM FULL does — reclaims dead tuples, reorganizes the heap, rebuilds indexes — while allowing reads and writes to continue uninterrupted. The third-party pg_repack extension has done this for years, but now it’s a first-class SQL command with no installation required. For teams running high-write tables at scale, this alone justifies testing Beta 4.
Parallel Autovacuum with Priority Scoring
Autovacuum has always been a black box. You could see it running, but you couldn’t tell why it picked that table first, or why your most-churned table was waiting behind something barely touched. PostgreSQL 19 fixes this with a proper scoring system:
-- See exactly why tables are queued for autovacuum
SELECT relname, score, last_autovacuum
FROM pg_stat_autovacuum_scores
ORDER BY score DESC
LIMIT 10;
Two new GUCs control parallelism: autovacuum_max_parallel_workers at the server level and autovacuum_parallel_workers per table. Workers now process indexes in parallel instead of sequentially, which matters most on large tables with multiple indexes — exactly where autovacuum was slowest before. The autovacuum_*_score_weight GUC family lets operators tune the priority algorithm if the defaults don’t fit their workload.
Async I/O Auto-Scaling
Less visible but foundational: io_method=worker now auto-scales its background worker count based on actual I/O demand rather than requiring you to guess a static value. New GUCs (io_min_workers, io_max_workers, io_worker_idle_timeout) give operators guardrails without forcing over-provisioning. EXPLAIN ANALYZE now includes AIO statistics per node, so you can finally see I/O wait time alongside CPU and row counts in query plans. This is infrastructure work — its biggest payoff will land in PostgreSQL 20 — but it’s worth testing now.
Developer Quality-of-Life
The biggest SQL improvement in PostgreSQL 19 for application developers is upsert visibility. The new ON CONFLICT syntax lets you see exactly which row caused the conflict and return its current data:
INSERT INTO events (id, payload)
VALUES ('abc-123', '{"type": "click"}')
ON CONFLICT (id) DO SELECT * RETURNING *;
Previously, you’d run a separate SELECT to see the conflicting row — an extra round trip on every conflict in deduplication pipelines and idempotency-heavy APIs. That workaround is gone.
Two monitoring additions round out the developer story. The new pg_stat_lock view surfaces per-lock-type contention statistics that were previously buried in pg_stat_activity. And per-process log_min_messages configuration means you can set autovacuum to debug1 without flooding your walsender logs — a small thing that saves hours when debugging maintenance issues in production.
What Got Cut (and Why That’s Fine)
SQL Property Graph Queries, ALTER TABLE MERGE/SPLIT PARTITIONS, GROUP BY ALL, and the switch to lz4 as the default TOAST compression — all reverted. On paper that looks like a disappointing release. In practice, GROUP BY ALL produced incorrect aggregation results, Property Graph had unresolved design concerns, and lz4 lacked buildfarm support. The PostgreSQL team caught these issues because the beta cycle worked: broad testing, AI-assisted bug detection, and a willingness to cut features rather than ship known defects. These will land in PostgreSQL 20. PostgreSQL 19 ships without them and is better for it.
| Reverted Feature | Reason | Expected In |
|---|---|---|
| SQL Property Graph Queries | Unresolved design concerns | PostgreSQL 20 |
| MERGE/SPLIT PARTITIONS | Design issues in beta review | PostgreSQL 20 |
| GROUP BY ALL | Incorrect aggregation results | PostgreSQL 20 |
| Default TOAST lz4 | Missing buildfarm support | PostgreSQL 20 |
When Should You Upgrade?
Don’t touch this in production yet. Beta 4 is for testing — run it against a replica or staging clone, exercise REPACK CONCURRENTLY on your bloatiest tables, and file bug reports if you find issues. The PostgreSQL team is targeting GA by end of October 2026. Until then, PostgreSQL 18 remains the recommended upgrade path for production systems.
To test Beta 4, the official PostgreSQL announcement has download links and upgrade instructions. The full release notes document every change since PostgreSQL 18. For a breakdown of why so many features were cut, Snowflake’s engineering team published a clear post-mortem analysis. And for the features nobody’s writing about, the Inside Data Engineering breakdown is worth reading before you test.













