PostgreSQL 18 工程师笔记:AIO、skip scan 与升级要处理的索引重建
PostgreSQL 18 于 2025-09-25 发布。18.6 于 2026-08-13 发布(18.5 因回绕后发现回归,未发布)。
- 发布公告:
- 18 发布说明:
- 18.6 发布说明:
AIO 异步 I/O 子系统
18 引入了 AIO 子系统,允许后端一次排队多个读请求,收益主要落在顺序扫描、bitmap heap scan、vacuum 这类 I/O 密集路径上。
启用方式由服务器参数 io_method 控制,另有 io_combine_limit 与 io_max_combine_limit 调节合并的 I/O 请求规模。Linux 上可选 io_uring,所有平台都有基于 worker 的实现。基准显示某些场景下读性能提升最多约 3 倍。
新系统视图 pg_aios 用来查看当前正在做异步 I/O 的文件句柄。
这套机制还带来一个副作用:在不支持 fadvise() 的系统上,也能把 effective_io_concurrency / maintenance_io_concurrency 设为大于 0。
pg_upgrade 保留优化器统计
pg_upgrade 现在会保留优化器统计信息,升级后达到预期性能所需的时间因此缩短,不必等统计信息重新收集。
多列 B-tree skip scan
多列 B-tree 索引支持 skip scan:当查询缺少一个或多个前缀索引列的 = 条件时,仍然可以使用该索引。此外,含 OR / IN (...) 的 WHERE 条件也能被优化为走索引。
uuidv7()
新增 uuidv7(),生成按时间排序的 UUID,对索引和读取都更友好。uuidv4() 作为 gen_random_uuid() 的别名。
虚拟生成列成为默认
生成列默认改为虚拟(读取时计算),需要写入时计算的场景仍可用 STORED 指定。存储生成列现在支持逻辑复制。
RETURNING 的 OLD / NEW
INSERT / UPDATE / DELETE / MERGE 的 RETURNING 可以显式返回旧值与新值,通过特殊别名 old / new 引用;别名可以重命名以避免冲突。
时间范围约束
主键 / 唯一约束支持 WITHOUT OVERLAPS,外键支持 PERIOD,用于表达时间范围的不重叠语义。
其他变更
- 新增 OAuth 认证。
- 新增内置排序规则
PG_UNICODE_FAST:提供大小写转换的完整 Unicode 语义,并加速比较;同时新增 casefold 函数。 - GIN 索引支持并行构建。
- 线路协议 3.2,这是自 7.4(2003)以来的首个新协议版本;libpq 仍默认使用 3.0。
- FIPS 模式校验。
ssl_tls13_ciphers。
升级注意点
- md5 密码认证已弃用,未来版本会移除,应改用 SCRAM。
- 全文检索改用集群默认排序规则提供者,而不是总是 libc。经过
pg_upgrade之后,可能需要重建所有全文检索索引与pg_trgm索引。