编程 PostgreSQL 18:io_uring 异步 I/O、uuidv7 与 NOT NULL NOT VALID 的落地要点

2026-09-27 21:02:49

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_FAST collation;新增 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/
复制全文 生成海报 PostgreSQL 18 uuidv7 io_uring pg_upgrade

推荐文章

程序员茄子在线接单