PostgreSQL 18 发布:io_method 三选一、uuidv7() 落地、虚拟生成列变成默认
PostgreSQL 18 于 2025-09-25 正式发布。
官方文档:https://www.postgresql.org/docs/18/release-18.html
发布说明页:https://pg.center/docs/18/release-18.html
AIO 子系统:io_method 决定走哪条路
18 引入异步 I/O 子系统,面向顺序扫描、位图堆扫描、VACUUM 这类操作,某些场景读取性能提升最高 3 倍。
由服务器变量 io_method 启用,三个取值:worker、io_uring,或 sync(保持旧行为)。io_combine_limit 和 io_max_combine_limit 控制合并请求的大小,系统视图 pg_aios 可以看当前异步 I/O 的文件句柄。
-- 先看当前生效值,再决定是否切换
SHOW io_method;
SET io_method = 'io_uring';
调优注意:io_uring 受内核版本和容器 seccomp 策略限制,起不来就退回 worker,不要为了追这一项把实例卡在启动失败上。压测时盯顺序扫描、位图堆扫描和 VACUUM,OLTP 点查这类场景本来就不吃 AIO。
另外 maintenance_io_concurrency 和 fadvise() 现在在不支持 effective_io_concurrency 的系统上也可以大于零。
uuidv7():把主键写回索引末尾
SELECT uuidv7();
uuidv7() 生成按时间戳排序的 UUID,高位是时间,B-tree 插入落在索引末尾,避免随机写放大,缓存与范围查询局部性也更好。同时新增 uuidv4(),是 gen_random_uuid() 的别名,用来显式生成 v4 UUID。
取舍:写入密集、又有范围扫描需求的表(事件、日志、订单)换 v7 收益直接;如果这个 UUID 会出现在 URL 或 token 里,注意 v7 前 48 位是毫秒时间戳,创建时间可被推断出来。
虚拟生成列成为默认
虚拟生成列(virtual generated columns)在读取时计算值,现在是生成列的默认选项。要落盘仍需显式声明 STORED。存储型生成列在本版开始支持逻辑复制。
RETURNING 同时拿到 OLD 与 NEW
UPDATE account SET balance = balance - 100
WHERE id = 42
RETURNING OLD.balance AS before, NEW.balance AS after;
INSERT、UPDATE、DELETE、MERGE 都适用,审计和变更回传不用再写一遍 SELECT。
其他值得过一眼的改动
- OAuth 2.0 认证,便于和 SSO 集成。
- 支持 skip scan(跳过扫描),多列 B-tree 索引在更多情况下可用。
pg_upgrade保留优化器统计信息,升级后不用整库重跑统计收集。PRIMARY KEY、UNIQUE、FOREIGN KEY支持时间约束/范围约束。initdb默认开启数据校验和。- 锁与哈希操作优化、VACUUM 改进。