PostgreSQL Field Guide

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

INSERTUPDATEDELETEMERGE 现在可以在 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-checksums initdb 选项可用于从未启用校验和的旧集群升级。
  • MD5 密码认证已弃用ALTER ROLE 设置 MD5 密码时会发出警告;应规划迁移到 SCRAM,而不是屏蔽警告。
  • 如上所述,pg_stat_wal 的读/同步列已移入 pg_stat_io;监控采集器需要相应调整。
  • 扩展、驱动、连接池、备份工具对 18 的支持要逐项确认;pg_upgrade 无法证明第三方模块兼容。

版本路径

来源

Last updated on

On this page