编程 PostgreSQL 18 发布:io_method 三选一、uuidv7() 落地、虚拟生成列变成默认

2026-09-20 21:01:27

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 启用,三个取值:workerio_uring,或 sync(保持旧行为)。io_combine_limitio_max_combine_limit 控制合并请求的大小,系统视图 pg_aios 可以看当前异步 I/O 的文件句柄。

-- 先看当前生效值,再决定是否切换
SHOW io_method;
SET io_method = 'io_uring';

调优注意:io_uring 受内核版本和容器 seccomp 策略限制,起不来就退回 worker,不要为了追这一项把实例卡在启动失败上。压测时盯顺序扫描、位图堆扫描和 VACUUM,OLTP 点查这类场景本来就不吃 AIO。

另外 maintenance_io_concurrencyfadvise() 现在在不支持 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;

INSERTUPDATEDELETEMERGE 都适用,审计和变更回传不用再写一遍 SELECT

其他值得过一眼的改动

  • OAuth 2.0 认证,便于和 SSO 集成。
  • 支持 skip scan(跳过扫描),多列 B-tree 索引在更多情况下可用。
  • pg_upgrade 保留优化器统计信息,升级后不用整库重跑统计收集。
  • PRIMARY KEYUNIQUEFOREIGN KEY 支持时间约束/范围约束。
  • initdb 默认开启数据校验和。
  • 锁与哈希操作优化、VACUUM 改进。

完整条目见 https://www.postgresql.org/docs/18/release-18.html

复制全文 生成海报 PostgreSQL 数据库 异步IO uuidv7 性能调优

推荐文章

程序员茄子在线接单