PostgreSQL 18 升级清单:AIO、skip scan 与虚拟生成列,以及 pg_upgrade 保留统计信息
官方公告:
完整 release notes:
一、异步 I/O 子系统(AIO)
PostgreSQL 18 引入异步 I/O 子系统,把顺序扫描、位图堆扫描、VACUUM 等操作中原本逐个等待的 I/O 请求改成并发排队发出。官方基准测试显示,特定场景下读性能最多有 3× 提升。
控制参数:
io_method:取值包括sync、worker、io_uringio_combine_limit、io_max_combine_limit:控制 I/O 请求的合并上限
新增系统视图 pg_aios,可以看到当前正在用于异步 I/O 的文件句柄。
顺带的一个变化:对于不支持 fadvise() 的系统,effective_io_concurrency 和 maintenance_io_concurrency 现在也能设为大于 0 的值。
调参时注意 io_uring 依赖运行环境支持,切换 io_method 后建议用 pg_aios 观察实际的并发排队情况,再结合压测调整 combine limit,不要在没压测的情况下直接套用他人的参数。
二、索引
- 多列 B-tree 支持 skip scan 查找:当查询缺少一个或多个前缀索引列上的等值条件时,规划器也能用上多列索引;
WHERE中的OR条件同样能被优化成走索引。 - GIN 索引支持并行构建。
三、通用性能
连接(join)的计划与执行有改进:增强了 hash join,并允许 merge join 使用增量排序(incremental sort)。
四、生成列
虚拟生成列(virtual generated columns)在查询时计算值,而不是存储值,现在这已经成为生成列的默认行为,存储开销更低。已存储(stored)的生成列现在支持逻辑复制。
五、工具命令与 DML
INSERT、UPDATE、DELETE、MERGE的RETURNING子句支持OLD/NEW,可以同时拿到修改前后的值,审计日志和变更追踪的写法可以简化。VACUUM和ANALYZE可以只处理分区表本身而不处理子表。- 新增用于修改单表、单列优化器统计信息的函数。
六、函数与排序规则
uuidv7():生成按时间有序的 UUID,索引表现优于 v4、索引碎片更少;uuidv4()是gen_random_uuid()的别名。casefold():做更精细的大小写无关匹配;新增内置排序规则提供方PG_UNICODE_FAST,在大小写转换上提供完整 Unicode 语义,同时加速比较。- 使用非确定性排序规则时,
text支持LIKE比较。 - 注意:全文检索现在使用集群的默认 collation provider,而不再固定使用 libc。
pg_upgrade之后,可能需要重建所有全文检索索引和pg_trgm索引。
七、约束
- 时间范围约束(temporal constraints):
PRIMARY KEY和UNIQUE可用WITHOUT OVERLAPS,FOREIGN KEY可用PERIOD。 CHECK和外键约束可以声明为NOT ENFORCED。- 分区表上允许
NOT VALID外键约束。
八、安全与认证
支持 OAuth 认证(通过 PostgreSQL 扩展实现 OAuth 2.0 机制)。新增 FIPS 模式校验;新增服务端参数 ssl_tls13_ciphers,用于配置 TLS v1.3 的密码套件。
九、升级与运维
pg_upgrade 有三处值得注意的变化:
- 现在会保留优化器统计信息,刚升级完的数据库不容易出现执行计划回退。
- 支持
--jobs并行执行检查与升级。 - 新增
--swap,用交换升级目录的方式代替复制文件。
另有新参数 file_copy_method 控制文件复制方式。
监控方面:pg_stat_io 新增以字节为单位报告 I/O 活动的列;pg_stat_get_backend_wal() 提供按后端的 WAL 统计;pg_stat_database 增加并行 worker 活动的列。
升级路径上,先确认全文检索与 pg_trgm 索引是否需要重建,再决定是否依赖 --swap 缩短停机窗口;pg_upgrade 保留统计信息降低了计划回退的概率,但涉及排序规则变化的对象仍要单独验证。