PostgreSQL 19 Beta1 这几天正式发布了,作为长期关注 PG 发展的从业者,看到这一版的更新清单,确实有些激动。这次更新的内容密度相当高,从 SQL 标准特性到底层性能优化,再到运维可观测性的加强,几乎覆盖了数据库使用的方方面面。下面把值得关注的新特性逐个梳理一下。
一、SQL 与查询能力大升级
1. SQL 属性图查询(SQL/PGQ)
PG19 正式引入了 SQL/PGQ 标准。这可不是一个小补丁,这意味着你可以在关系型数据上直接执行图查询,而不再需要额外部署一套图数据库。你可以通过 CREATE PROPERTY GRAPH 定义图结构,然后使用 MATCH 子句进行图遍历查询。
-- 建图定义
CREATE PROPERTY GRAPH social_network
NODE TABLES (
users LABEL person,
cities LABEL city
)
EDGE TABLES (
follows SOURCE KEY (follower_id) REFERENCES users(id)
DESTINATION KEY (followee_id) REFERENCES users(id)
LABEL follows,
lives_in
SOURCE KEY (user_id) REFERENCES users(id)
DESTINATION KEY (city_id) REFERENCES cities(id)
LABEL lives_in
);
-- 图查询:查找"我关注的人住在哪些城市"
SELECT city_name
FROM GRAPH_TABLE social_network
MATCH (p:person WHERE p.name ='alice')-[f:follows]-> (friend:person)-[l:lives_in]-> (c:city)
COLUMNS (c.name AS city_name);
这相当于在关系数据库里内嵌了一个图引擎,一库搞定“关系型+图”两个场景。
2. UPDATE/DELETE FOR PORTION OF
这个特性解决了时态数据管理的痛点,支持对时间范围进行局部更新或删除。以往我们要修改某段历史区间的薪资数据,需要做很多复杂的拆分逻辑,现在一条 SQL 就能搞定。
-- 创建时态表
CREATE TABLE employee_salary (
id INT PRIMARY KEY,
name TEXT,
salary NUMERIC,
valid_from DATE NOT NULL,
valid_to DATE NOT NULL,
PERIOD FOR validity (valid_from, valid_to)
);
INSERT INTO employee_salary VALUES
(1, 'alice', 10000, '2025-01-01', '2025-12-31');
-- 只更新 3~6 月的薪资(其余时间段自动拆分保留)
UPDATE employee_salary
FOR PORTION OF validity FROM '2025-03-01' TO '2025-07-01'
SET salary = 12000
WHERE id = 1;
-- 结果会自动拆分为 3 段
同理,局部删除也能精准操作,这在薪资审计、合同管理等场景中非常实用。
3. GROUP BY ALL
一个小细节但很贴心——GROUP BY ALL 简化了语法,自动把所有非聚合列纳入分组,告别手动罗列字段的麻烦。
SELECT region, product, channel, SUM(amount), COUNT(*)
FROM sales
GROUP BY ALL;
4. 窗口函数 IGNORE NULLS
在处理有时间序列缺失值的数据时(比如股票价格、传感器数据),LAG、LEAD、FIRST_VALUE、LAST_VALUE、NTH_VALUE 现在支持 IGNORE NULLS,直接跳过后面的空值取前一个有效值。
SELECT ts, price, LAG(price) IGNORE NULLS OVER (ORDER BY ts) AS prev_valid_price
FROM stock_prices;
5. INSERT ... ON CONFLICT DO SELECT
当插入冲突时,以前只能选择“更新”或“忽略”,现在多了一个选项——直接返回冲突行。这在上层逻辑判断时非常有用,比如需要知道是哪个已有数据导致了冲突。
INSERT INTO users (email, name) VALUES ('alice@test.com', 'alice new')
ON CONFLICT (email) DO SELECT
RETURNING id, email, name;
6. REPACK 命令
REPACK 是 VACUUM FULL 和 CLUSTER 的统一替代方案,而且支持在线操作。这意味着你可以在不阻塞读写的情况下对表进行重组。
REPACK TABLE orders CONCURRENTLY;
7. 分区合并与拆分
分区表运维终于变灵活了。之前要合并或拆分分区,往往需要 DROP 重建,现在一条 ALTER TABLE 就能完成。
ALTER TABLE orders MERGE PARTITIONS (orders_2025_q1, orders_2025_q2) INTO orders_2025_h1;
ALTER TABLE orders SPLIT PARTITION orders_2025_h1 INTO ( … );
8. COPY 增强
COPY 命令迎来了多项增强:支持导出 JSON 格式、导入时跳过多个表头行、无效值自动置为 NULL。
COPY (SELECT id, name, email FROM users LIMIT 3) TO '/tmp/users.json' (FORMAT json, FORCE_ARRAY);
COPY sensor_data FROM '/tmp/sensor.csv' WITH (FORMAT csv, HEADER 3);
COPY products (id, name, price) FROM '/tmp/products.csv' WITH (FORMAT csv, HEADER, ON_ERROR set_null);
二、性能与优化器:更快、更智能
1. JIT 默认禁用
这是一个值得注意的变化。PG19 中 JIT 从默认开启改为默认关闭。对于 OLTP 场景来说这是好消息,因为 JIT 的编译开销往往是负担;对于分析型查询,可以手动开启。
SET jit = on;
SET jit_above_cost = 100000;
2. Anti-Join 优化
NOT IN 和 NOT EXISTS 这类反连接查询在 PG19 中得到了专门的优化,优化器能自动识别并使用 hash anti join,性能提升明显。
EXPLAIN ANALYZE SELECT u.id, u.name FROM users u WHERE u.id NOT IN (SELECT user_id FROM orders);
3. 并行 Autovacuum
大表的 autovacuum 可以并行执行了。通过设置 autovacuum_max_parallel_workers 和表级的 autovacuum_vacuum_parallel_workers,可以显著加快大表的清理速度。
ALTER SYSTEM SET autovacuum_max_parallel_workers = 4;
ALTER TABLE huge_orders SET (autovacuum_vacuum_parallel_workers = 4);
4. SIMD 加速 COPY
在支持 A VX2/A VX-512 的 CPU 上,COPY 使用 SIMD 指令解析文本和 CSV,导入速度显著提升。
5. LZ4 成为默认 TOAST 压缩算法
PG19 开始,default_toast_compression 的默认值从 pglz 改为 lz4。LZ4 在压缩速度和压缩比之间取得了更好的平衡,新建表会自动使用。
SHOW default_toast_compression; -- 输出:lz4
6. 其他性能改进
- 基数排序(Radix Sort):整数排序自动使用,排序效率更高。
- TID Range Scan 并行化:可以并行扫描物理位置范围。
- 异步 I/O 预读:通过 io_min_workers 和 io_max_workers 控制。
- 外键检查性能提升:大量外键约束的 DML 场景自动受益。
三、逻辑复制与高可用
1. 序列同步
逻辑复制最大的痛点之一终于解决了——序列值可以在订阅端同步,主键冲突的问题得到根治。
ALTER SUBSCRIPTION sub_all REFRESH SEQUENCES;
2. 发布排除表
创建发布时,可以指定排除某些表,比如审计日志、临时表等。
CREATE PUBLICATION pub_main FOR ALL TABLES EXCEPT (audit_log, temp_cache, session_data);
3. Standby 等待 LSN
应用写入主库后,可以通过 pg_wal_wait_for_lsn 函数在备库等待该 LSN 已回放,这对读写分离架构的强一致性场景至关重要。
SELECT pg_wal_wait_for_lsn('0/1A2B3C4D', 'replay', 5000);
4. 其他复制改进
冲突信息保留、死元组保留限制、WAL sender 关闭超时、按订阅设置不同的 WAL receiver 超时——每一处改进都在让逻辑复制更健壮。
四、监控、统计与可观测性
PG19 在运维可观测性上下足了功夫。pg_stat_lock 可以查看锁的获取次数和等待时间;pg_stat_recovery 可以查看备库恢复进度;autovacuum 引入了评分系统,可以精细控制不同表的清理优先级;EXPLAIN (ANALYZE, IO) 能看到 I/O 相关细节;进程级日志级别允许为 autovacuum 单独设置 DEBUG 级别。
五、安全与认证
1. 移除 RADIUS 认证
RADIUS 认证在 PG19 中已被移除,建议迁移到 LDAP 或 SCRAM-SHA-256。
2. MD5 密码警告
使用 MD5 密码登录时会收到弃用警告,建议尽快迁移到 SCRAM-SHA-256。
3. 在线数据校验和
这是不少 DBA 期待已久的功能。以前启用数据校验和必须停机运行 pg_checksums,现在可以直接在线启用。
ALTER DATABASE mydb SET data_checksums = on;
4. OAuth 增强
libpq 支持在连接字符串中指定 OAuth token 和 CA 证书,这为云原生环境的安全接入提供了更便利的方式。
5. 对象名称安全检查
PG19 会自动拦截包含换行符的对象名称,从根本上杜绝了注入风险。
六、数据类型与函数
新增了 OID8 类型支持超大 OID;jsonpath 支持字符串方法(trim、lower、split_part、replace);bytea 与 uuid 之间可以互相转换;random(min, max) 支持时间类型;新增 base64url 和 base32hex 编码;新增 DDL 生成函数(pg_get_role_ddl、pg_get_tablespace_ddl、pg_get_database_ddl);全文搜索新增波兰语和世界语词干提取。
七、升级须知:Breaking Changes
升级前务必关注以下不兼容变更:JIT 默认关闭、max_locks_per_transaction 默认值翻倍、inet/cidr 索引 opclass 变更、standard_conforming_strings 强制开启、mule_internal 编码移除、json_array() 行为变更(空结果返回 [] 而非 null)、postgres_fdw 只读事务传递、C 语言标准升级至 C11。
八、其他亮点
pg_dumpall 支持非文本格式(custom、directory、tar);pg_upgrade 对大对象的迁移进行了优化;支持 Unicode 17.0.0;新增 pg_plan_advice 模块,可以为特定查询模式强制使用索引扫描。
总结
PostgreSQL 19 是一次全面而深入的版本更新。SQL/PGQ 图查询让 PG 成为“关系型+图”双引擎;SIMD 加速、并行 Autovacuum、LZ4 默认压缩带来全方位性能提升;逻辑复制增强(序列同步、排除表、冲突保留)让分布式场景更可靠;在线数据校验和、OAuth 增强、MD5 警告持续加固安全基线;pg_stat_lock、IO 报告、进程级日志让运维可观测性再上新台阶。
目前 PG19 处于 Beta1 阶段,预计将于 2026 年 9-10 月正式发布。
