PostgreSQL 18:新特性与升级注意点
PostgreSQL 18(2025-09 GA)核心变化 —— 异步 I/O、uuidv7()、虚拟生成列、B-tree skip scan、RETURNING OLD/NEW,附升级注意点
PostgreSQL 18 于 2025-09-25 正式发布(GA),支持至 2030-11-14。截至本页核对日,当前 minor 为 18.4;实时支持状态见 版本与支持策略。以下所有特性声明均已对照 PostgreSQL 18 官方 release notes 核实。
异步 I/O(AIO)
PostgreSQL 18 是第一个具备真正异步 I/O 子系统的版本,构建在 PostgreSQL 17 引入的流式 I/O 框架之上。I/O 请求发出后后端不再逐次阻塞等待,顺序扫描、vacuum 和 bitmap heap scan 都会受益。
行为由 io_method 控制:
sync—— 传统的同步 I/O;worker—— 由后台 I/O worker 进程执行;这是默认值,为了更广泛的兼容性而选择;io_uring—— 在受支持的内核上使用 Linux io_uring。
PostgreSQL 18 发布公告称基准测试中特定场景最高有约 3× 提升。请把它当作上限而不是预期:切换 io_method 前后都用自己的工作负载实测,从 worker 换到 io_uring 也要先测试再上线。
内置 uuidv7()
SELECT uuidv7();UUID v7 内嵌 48 位毫秒时间戳,生成的值大致按时间有序。与随机的 v4 UUID 相比,时间有序的主键会插入 B-tree 的右缘,高写入场景下主键索引更紧凑、对缓存更友好。新表可以直接采用:
CREATE TABLE events (
id uuid PRIMARY KEY DEFAULT uuidv7()
);虚拟生成列(virtual generated columns)
ALTER TABLE orders ADD COLUMN
total numeric GENERATED ALWAYS AS (qty * price) VIRTUAL;PostgreSQL 18 之前,生成列一律是 STORED——写入时计算并占用磁盘。PostgreSQL 18 增加了 VIRTUAL 生成列:读取时计算、不占用存储,并将 VIRTUAL 设为默认;需要写入时计算的行为仍可显式指定 STORED。
B-tree skip scan
过去,(a, b) 上的复合 B-tree 索引必须带前导列 a 的过滤条件才用得上。PostgreSQL 18 支持 skip scan:执行器遍历 a 的不同取值,逐个下钻到对应的 b 区间,因此只按非前导列过滤的查询也能使用该索引。一些当年仅为覆盖第二列而建的索引可能已经不再必要——但请先在真实数据上用 EXPLAIN (ANALYZE, BUFFERS) 验证再删除。
RETURNING 支持 OLD / NEW
INSERT、UPDATE、DELETE 和 MERGE 现在可以在 RETURNING 中显式返回新旧两个行版本:
UPDATE products SET price = price * 1.1
RETURNING OLD.price AS prev_price, NEW.price AS new_price;过去要在一条语句里拿到变更前后的值,往往需要 CTE 或自连接的变通写法,现在可以省去。
PostgreSQL 18 的其他变化
EXPLAIN ANALYZE自动附带BUFFERS输出,常见场景下不再需要显式加选项。COPY FROM新增REJECT_LIMIT,限制ON_ERROR ignore模式下可丢弃的无效行数,超过即失败。(ON_ERROR ignore本身是在 PostgreSQL 17 加入的。)pg_stat_io新增按字节统计的 I/O 列,并报告 WAL I/O 行;相应地,pg_stat_wal移除了读/同步相关列——引用过这些列的监控看板需要更新。pg_upgrade现在会保留优化器统计信息,缩短大版本升级后计划劣化的窗口期。
PostgreSQL 18 不包含内置 TDE
透明数据加密(TDE)在 PostgreSQL 18 开发周期内曾被提议,但最终没有合并,PostgreSQL 18 不带内置的页级加密。静态加密仍然需要文件系统或磁盘层加密(如 LUKS)、存储层能力,或提供 TDE 的厂商发行版。不要围绕"本版本会有核心 TDE"来做规划。
升级到 PostgreSQL 18 的注意点
- 大版本升级需要
pg_upgrade、dump/restore 或逻辑复制;数据目录不跨大版本兼容。 initdb现在默认启用数据校验和(data checksums)。 由于pg_upgrade要求两端校验和设置一致,新增的--no-data-checksumsinitdb 选项可用于从未启用校验和的旧集群升级。- MD5 密码认证已弃用,
ALTER ROLE设置 MD5 密码时会发出警告;应规划迁移到 SCRAM,而不是屏蔽警告。 - 如上所述,
pg_stat_wal的读/同步列已移入pg_stat_io;监控采集器需要相应调整。 - 扩展、驱动、连接池、备份工具对 18 的支持要逐项确认;
pg_upgrade无法证明第三方模块兼容。
版本路径
- 上一大版本:PostgreSQL 17:新特性与升级注意点
- 截至 2026-08 处于 Beta:PostgreSQL 19:新功能与 18 升级 19 指南
- 支持周期:版本与支持策略
来源
Last updated on