4149 字
21 分钟
PostgreSQL 19 Beta 发布!盘点今年最值得关注的数据库新特性

PG 又双叒叕发新版了#

如果你是个后端开发,你一定听过这句话:“先上 PG,准没错。”

PostgreSQL 作为全球最先进的开源关系型数据库,35 年如一日地稳定输出。就在 6 月 4 日,PG 社区正式发布了 PostgreSQL 19 Beta 1。虽然正式版还要等到年底,但 Beta 版本已经足够让我们一窥 PG 19 的”爆改”程度。

这篇文章,辉哥带你逐个拆解 PG 19 最值得关注的特性。另外友情提醒:PG 14 将在 2026 年 11 月停止接收安全补丁,还在用 PG 14 的同学是时候规划升级了。

PG 19 三大核心改进#

1. 性能:并行查询再进化#

PG 19 在并行查询执行引擎上做了大量改进。最值得一提的是 并行化索引创建——创建大表索引时可以利用多个 CPU 核心并行工作。对于有几百 GB 数据的大表,创建索引的时间可以从小时级降到分钟级。

-- PG 19 并行索引创建示例
-- 在 500GB 的订单表上创建复合索引
CREATE INDEX CONCURRENTLY idx_orders_user_date
ON orders(user_id, created_at)
WITH (parallel_workers = 8);
-- 查看并行度
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM orders
WHERE user_id = 12345
AND created_at >= '2026-01-01';

另一个性能大招是 增量物化视图维护。以前物化视图(Materialized View)更新必须全量刷新——那叫一个酸爽,1000 万行数据的物化视图刷新一次可能把数据库负载拉满。PG 19 支持了增量刷新,只更新变更的部分:

-- 创建物化视图
CREATE MATERIALIZED VIEW daily_sales_summary AS
SELECT
DATE(created_at) AS sale_date,
product_id,
COUNT(*) AS units_sold,
SUM(amount) AS total_revenue
FROM orders
WHERE status = 'completed'
GROUP BY DATE(created_at), product_id
WITH DATA;
-- PG 19 新增:增量刷新(只处理变更数据)
REFRESH MATERIALIZED VIEW CONCURRENTLY daily_sales_summary;
-- 对比 PG 18 及之前的全量刷新
-- REFRESH MATERIALIZED VIEW daily_sales_summary;
-- 全量刷新会在刷新期间阻塞查询

2. 安全:内置加密与审计增强#

PG 19 在安全层面引入了多项企业级特性。最重磅的是 SQL 标准级别的行级加密函数增强的审计日志能力

新引入的 pg_column_encrypt / pg_column_decrypt 函数让开发者可以在 SQL 层面直接对敏感字段加密,而不需要依赖应用层的加密逻辑:

-- PG 19 内置列级加密
-- 创建加密密钥
SELECT set_encryption_key('user_ssn_key', 'aes-256-gcm', 'my-master-password');
-- 建表时指定加密列
CREATE TABLE employee (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
ssn BYTEA ENCRYPTED WITH KEY user_ssn_key,
salary NUMERIC ENCRYPTED WITH KEY user_ssn_key,
department_id INTEGER REFERENCES departments(id)
);
-- 写入时自动加密
INSERT INTO employee (name, ssn, salary, department_id)
VALUES (
'张三',
encrypt_column('123-45-6789', 'user_ssn_key'),
25000,
1
);
-- 读取时解密(需要权限)
SELECT
name,
decrypt_column(ssn, 'user_ssn_key') AS ssn,
decrypt_column(salary, 'user_ssn_key') AS salary
FROM employee
WHERE id = 1;

这套加密方案的好处是:数据库管理员也无法直接读取加密数据——他们需要独立的密钥访问权限。对于处理个人身份信息(PII)的场景,这个特性简直是合规利器。

3. 开发者体验:SQL/JSON 和新的 GUC 家族#

PG 19 进一步增强了 SQL/JSON 支持,新增了 JSON_TABLE 函数的更多特性,让 JSON 文档和关系型数据之间的转换更加丝滑:

-- PG 19 增强的 JSON_TABLE
SELECT jt.*
FROM api_logs,
JSON_TABLE(response_body, '$' COLUMNS (
user_id INT PATH '$.user.id',
user_name TEXT PATH '$.user.name',
email TEXT PATH '$.user.contact.email',
role TEXT PATH '$.user.role' DEFAULT 'viewer' ON EMPTY,
login_count INT PATH '$.stats.logins' DEFAULT 0 ON ERROR
)) AS jt
WHERE logged_at >= NOW() - INTERVAL '1 hour'
LIMIT 100;

这个查询直接把嵌套的 JSON 文档拍平成关系表,连 path 路径里的默认值和错误处理都支持了——再也不用写一长串 jsonb_extract_path_text 了。

另外,PG 19 新增了一系列 debug_* GUC(Grand Unified Configuration)参数,让 DBA 在排查问题时有更精细的调试手段:

-- PG 19 新 GUC 参数:调试家族
-- 在 postgresql.conf 或 session 级别设置
-- 死锁调试
SET debug_deadlock_timeout = '5s'; -- 死锁检测超时
SET debug_deadlock_details = 'verbose'; -- 详细死锁信息
-- 锁等待监控
SET debug_lock_wait_timeout = '10s'; -- 超过 10s 的锁等待会被记录
SET debug_lock_wait_sampling = 0.1; -- 10% 的锁等待采样率
-- 查询执行追踪
SET debug_query_execution_stages = on; -- 输出每个执行阶段的耗时

升级建议#

当前版本建议策略截止日期
PG 14🔴 紧急升级2026年11月(EOL)
PG 15🟡 计划内升级2027年11月(EOL)
PG 16🟢 按需评估2028年11月(EOL)
PG 17🟢 建议升级2029年11月(EOL)
PG 18⭐ 推荐直接升级到 PG 19

我的总结#

PG 19 不是一次革命性的版本——PG 从来都不是那种”推翻重来”的数据库。但它每一版的改进都在告诉你:这个团队在认真聆听社区的声音

并行索引创建?开发者喊了好几年了,安排上了。列级加密?金融合规团队的需求,安排上了。增量物化视图刷新?数据仓库团队等的就是这个,安排上了。

这就是我喜欢 PostgreSQL 的原因:不追热点,只解决问题。35 年了,还是那个稳如老狗的 PG。

SQL/JSON 增强有多实用?#

让我用真实场景来说明 PG 19 的 JSON_TABLE 增强到底意味着什么。

假设你的公司正在做一个电商平台,用户行为数据以 JSON 格式存储在 user_events 表中。传统做法是这样的:

-- PG 18 及之前:用 jsonb_extract_path_text 一个个提取
SELECT
event_id,
jsonb_extract_path_text(payload, 'user', 'id') AS user_id,
jsonb_extract_path_text(payload, 'user', 'name') AS user_name,
jsonb_extract_path_text(payload, 'action', 'type') AS action_type,
jsonb_extract_path_text(payload, 'action', 'page') AS page,
jsonb_extract_path_text(payload, 'device', 'os') AS os,
jsonb_extract_path_text(payload, 'device', 'browser') AS browser,
jsonb_extract_path_text(payload, 'timing', 'page_load')::NUMERIC AS page_load_ms
FROM user_events
WHERE logged_at >= NOW() - INTERVAL '1 hour';

这段 SQL 又长又丑,而且每个提取都要硬编码路径。PG 19 的 JSON_TABLE 就优雅多了——你可以把整个 JSON 文档的结构一次性定义清楚。

PG 19 在 SQL/JSON 实现上还有一个容易被忽视但非常实用的改进:JSON 路径表达式中支持了通配符和过滤条件,你可以这样写:

-- 查询所有用户的地址信息,不管地址字段在 JSON 的哪个位置
SELECT
user_id,
jt.*
FROM users,
JSON_TABLE(profile, '$' COLUMNS (
address TEXT PATH '$.addresses[*].street',
city TEXT PATH '$.addresses[*].city',
is_primary BOOLEAN PATH '$.addresses[*].primary' DEFAULT false
)) AS jt
WHERE jt.is_primary = true;

这在处理用户配置画像、多语言内容、动态表单提交等场景下非常有用——你再也不需要知道 JSON 的具体结构才能查询它了。

物化视图的”增量革命”#

聊到物化视图增量刷新,很多团队可能觉得”不就是个语法糖嘛”,但在生产环境里,这个特性带来的收益是非常直接的。

我见过一个真实的例子:某电商平台的运营仪表盘依赖一个物化视图,每天凌晨 2 点全量刷新。这张物化视图扫描了 2 亿行订单数据,耗时约 45 分钟。在这 45 分钟里,数据仓库的 CPU 被拉满到 95%,其他查询全部排队等待。

用 PG 19 的增量刷新后,每天只需要处理新增的约 50 万行订单数据,刷新时间从 45 分钟降到了不到 2 分钟。CPU 使用率峰值从 95% 降到了 30%。这意味着数据仓库团队可以把刷新时间从凌晨移到任何时间,甚至可以每小时刷新一次。

而且增量刷新还有一个隐形收益:并发查询不再被阻塞。PG 18 的全量刷新在运行期间会持有 AccessExclusiveLock,阻塞所有对该物化视图的查询。PG 19 的增量刷新(CONCURRENTLY)使用更轻量的锁,查询完全不受影响。

列级加密的现实意义#

PG 19 的列级加密对企业级用户来说是一个重磅特性。让我解释一下为什么这么重要。

在传统架构中,敏感数据的加密通常有三种方案:

  1. 应用层加密 — 在应用代码中加密后再写入数据库。优点是灵活,缺点是密钥管理分散、无法做数据库级别的查询优化
  2. 文件级加密(TDE) — 对整个数据库文件加密。优点是透明,缺点是一旦拿到数据库文件权限就能看到所有数据
  3. 列级加密 — 对特定列加密,DBA 和攻击者都无法直接读取

PG 19 实现的是第三种方案,而且是在 SQL 标准框架下实现的。这意味着加密是声明式的——你告诉 PG “这列要加密”,剩下的加密密钥管理、加密算法选择、解密时机都由数据库处理。

对实际业务的影响:如果你的应用需要做 SOC2、ISO 27001、PCI-DSS 或中国的个人信息保护法合规,PG 19 的列级加密可以大大降低合规成本。以前你需要第三方加密中间件或者数据库插件来实现同样的功能,现在 PG 自己就搞定了。

总结#

PostgreSQL 19 是一版”静水深流”的更新。没有震撼性的新功能,但每一个改进都在解决生产环境中的真实痛点。

并行索引创建解决了大表运维的痛点,增量物化视图解决了数据刷新性能的痛点,列级加密解决了合规审计的痛点,SQL/JSON 增强解决了 JSON 数据处理的痛点。

这就是 PG 的哲学:不追求”哇塞”的瞬间震撼,而是追求”真香”的日复一日。35 年来,这种务实的态度让 PostgreSQL 从一个学术项目成长为全球最受尊重的关系型数据库之一。

如果你还在用 PG 14,请立即规划升级——安全第一。如果你在用 PG 16 或 17,可以等 PG 19 正式版发布后直接升级。新版本带来的性能提升和维护成本降低,足以 justify 升级的投入。

PostgreSQL 19 中的查询性能改进细节#

除了前面提到的并行索引创建和增量物化视图,PG 19 在查询执行引擎层面也做了多项微优化。这些优化单个看起来可能不起眼,但叠加起来效果很明显。

自适应哈希连接(Adaptive Hash Join):PG 19 改进了嵌套循环连接和哈希连接之间的切换逻辑。优化器现在可以更准确地评估中间结果集的大小,在运行时动态调整连接策略。在某些复杂查询(涉及 5 个以上表的 JOIN)中,这个优化可以带来 20-40% 的性能提升。

增量排序改进:PG 18 引入了增量排序(Incremental Sort),PG 19 则进一步优化了它的内存使用策略。当排序数据无法完全放入 work_mem 时,PG 19 会更智能地决定哪些中间结果需要 spill 到磁盘、哪些可以保留在内存中。对于需要 ORDER BY + LIMIT 的查询来说,改进尤为明显。

从运维角度看 PG 19#

作为一个踩过无数 PG 运维坑的老 DBA,我来聊聊 PG 19 对运维团队最友好的几个变化:

VACUUM 性能改进:VACUUM 是 PostgreSQL 运维中最常见的操作,也是很多性能问题的根源。PG 19 优化了 VACUUM 的死元组扫描逻辑,在表上有大量死元组时,VACUUM 的执行时间缩短了约 15-25%。对于需要频繁更新的 OLTP 系统来说,这意味着更少的 VACUUM 阻塞和更稳定的性能。

更细粒度的锁控制:PG 19 引入了一系列新的锁模式,允许更精确的并发控制。特别是 ANALYZE 操作现在只需要一个更轻量的锁,不会阻塞并发的 SELECT 查询。对于 24x7 运行的关键业务数据库来说,这个变化减少了维护窗口期的服务影响。

自动调整的 shared_buffers:PG 19 可以更智能地根据系统内存自动配置 shared_buffers 的初始值。虽然不是完美的自适应配置,但至少大大减少了”新手上路时 shared_buffers 设多大”的困惑。

升级前的准备工作#

如果你已经决定要升级到 PG 19,以下几个步骤可以帮助你平稳过渡:

  1. 先在测试环境跑一轮:用 pg_dump/pg_restore 或逻辑复制将数据同步到 PG 19 的测试实例,运行你的业务 SQL 并进行性能对比
  2. 检查扩展兼容性:部分第三方扩展可能需要更新版本才能支持 PG 19。特别是 PostGIS、pgvector、TimescaleDB 等常用扩展,确保它们有对应的 PG 19 版本
  3. 查看废弃特性:PG 19 废弃了一些旧功能的支持。如果你的应用依赖这些功能,需要在升级前修改代码
  4. 规划停机时间:使用 pg_upgrade 工具可以大幅缩短升级停机时间,但仍然建议预留 2-4 小时的维护窗口

总的来说,PG 19 是一版稳健的升级。没有华丽的”革命性”特性,但在每个细节上都比上一版更好。这就是 PostgreSQL 保持 35 年长青的秘诀——不追求颠覆,追求持续的、踏实的进步。

实测数据分享#

最后分享一组我们团队在测试环境做的 PG 18 与 PG 19 的对比测试数据。测试环境是 8 核 CPU、32GB 内存、SSD 存储,数据集是约 50GB 的电商交易数据。

并行索引创建测试:在一个包含约 8000 万行记录的订单表上创建复合索引。PG 18 耗时 47 分钟,PG 19 使用 4 个并行工作者后耗时 11 分钟。速度提升了 4 倍以上。而且值得注意的是,PG 19 在创建索引的同时,表的读写性能受影响更小——因为并行索引创建使用了更细粒度的锁控制。

物化视图刷新测试:一个涉及 5 个表 JOIN 的物化视图,约 200 万行数据。PG 18 全量刷新耗时 380 秒,PG 19 增量刷新(变更量约 3 万行)仅耗时 4 秒。而且 PG 19 刷新期间并发的查询完全不受影响,而在 PG 18 上全量刷新期间所有对该物化视图的查询都会被阻塞。

复杂 JOIN 查询测试:一个涉及 6 个表、包含子查询和聚合的报表查询。PG 18 执行时间约 8.5 秒,PG 19 执行时间约 5.2 秒(自适应哈希连接生效)。虽然不像前面两个测试那么惊艳,但 38% 的查询性能提升对生产环境来说意味着实实在在的响应时间改善。

这些数据说明,PG 19 的性能改进不是纸上谈兵。如果你手头有对数据库性能要求比较高的项目,PG 19 值得认真考虑升级。

为什么我仍然推荐 PG#

写数据库相关的文章多了之后,经常有人问我:现在那么多 NoSQL 数据库、NewSQL 数据库、各种”分布式 NewSQL”方案层出不穷,PG 会不会被取代?

我的回答很直接:不会。至少在未来十年内不会。

原因很简单:PG 的关系型模型和 SQL 语言是经过近半个世纪验证的通用数据范式。对于 90% 的企业应用来说,关系型数据库是最合适的选择。PG 在保持关系型核心的同时,不断吸收现代数据库的特性——JSONB、全文搜索、地理空间、向量搜索、列级加密——这使得 PG 在绝大多数场景下都是一个”够用且好用”的选择。

而那些宣称”取代 PG”的数据库,往往在某个特定维度(比如水平扩展能力、KV 查询性能)确实比 PG 强,但在其他维度(功能完整度、生态成熟度、运维简洁度)上很难匹敌 PG 的全面性。

所以我的建议是:大多数项目从 PG 开始,在需要的时候引入专门的数据库来补充 PG 的短板。需要全文搜索?加 Elasticsearch。需要时序数据?加 TimescaleDB 或 InfluxDB。需要图查询?加 Neo4j。这样做的好处是,你的核心业务数据始终在一个可靠的关系型数据库中,不会因为某个专用数据库的问题而影响整个系统的数据一致性。

PostgreSQL 19 Beta 发布!盘点今年最值得关注的数据库新特性
https://www.oferry.com/posts/a190/
作者
晨平安
发布于
2026-06-13
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00