PostgreSQL 18:io_uring 异步 I/O、uuidv7 与 NOT NULL NOT VALID 的落地要点
版本信息
PostgreSQL 18 于 2025-09-25 发布。18.6(2026-08-13)是一次例行更新,含 28 个安全修复与 110+ bug 修复(跳过未发布的 18.5)。
异步 I/O 子系统
- 新参数
io_method:Linux 上可用io_uring,其它平台使用基于 worker 的回退方案。 - 配套参数
io_combine_limit、io_max_combine_limit。 - 新系统视图
pg_aios,用于查看在途文件句柄。 - 第一波覆盖读取路径:顺序扫描、bitmap heap scan、VACUUM。官方称某些场景最多 3x。
skip scan
多列 B-tree 索引在前缀列缺少等值条件时也能被用上;也能把 WHERE 里的 OR 优化成走索引。
uuidv7()
uuidv7() 生成时间有序 UUID,缓解 v4 随机分布导致的索引页碎片与插入性能问题。uuidv4() 现为 gen_random_uuid() 的别名。
虚拟生成列
虚拟生成列成为生成列的默认形式(读时计算),需要物化时仍可用 STORED;存储型生成列现在可逻辑复制。
RETURNING OLD/NEW
RETURNING 支持可变的 OLD/NEW 别名,适用于 INSERT/UPDATE/DELETE/MERGE;INSERT ... ON CONFLICT 能返回旧值。
-- RETURNING OLD/NEW 可用于 INSERT / UPDATE / DELETE / MERGE
-- INSERT ... ON CONFLICT 可返回旧值
NOT NULL NOT VALID
NOT NULL 约束可以先以 NOT VALID 加上(跳过全表扫描),之后再单独校验。校验阶段持 ShareUpdateExclusiveLock,读写在期间照常进行;但新写入的 NULL 从约束创建那刻起就被拒。
pg_upgrade 与其它变更
pg_upgrade保留优化器统计,升级后不用等ANALYZE重建计划;--jobs并行化预检;--swap直接交换目录而非复制。- OAuth 认证;新增
PG_UNICODE_FASTcollation;新增casefold();弃用 md5 密码认证(改用 SCRAM)。
升级不兼容点
时区缩写处理、MD5 弃用、VACUUM/ANALYZE 的继承行为、COPY FROM 文件尾处理都变了。
全文搜索改为使用集群默认 collation provider,而不是固定 libc,升级后可能需要重建 FTS 与 pg_trgm 索引。
18.6 值得注意的修复
- 并行 GIN 索引构建可能把
pg_class.reltuples写成 bogus 值(含Infinity/NaN),会导致 autovacuum/autoanalyze 不再处理该表且不会自愈;有 GIN 索引的表升级后应检查reltuples。 btree_gist对float4/float8的 NaN 处理、bit/bit varying排序问题。ltree比较的整数溢出(超过约 14653 个标签可能比较错误,表现为 B-tree 索引损坏)。jsonpath的@?/@@对未定义变量现在正确报错。- 时区数据更新到 tzdata 2026c。
文档
- PostgreSQL 18 发布说明:https://www.postgresql.org/docs/18/release-18.html
- PostgreSQL 18.6 发布说明:https://www.postgresql.org/docs/release/18.6/