PostgreSQL 18 发布
PostgreSQL 全球开发组宣布最新版本 PostgreSQL 18 正式发布。
PostgreSQL 18通过全新的I/O 子系统提升了各种规模工作负载的性能,在从存储读取数据时实现了高达3 倍的性能提升,并增加了可使用索引的查询数量。该版本降低了主版本升级的影响,加速了升级速度,并缩短了升级完成后达到预期性能所需的时间。开发者也能从 PostgreSQL 18的功能中获益,包括可在查询时动态计算值的虚拟生成列,以及提升数据库易用性并能为UUID提供更优索引和读取性能的 uuidv7()
函数。PostgreSQL 18 支持OAuth 2.0 身份验证,使其更易于与单点登录(SSO)系统集成。
PostgreSQL核心团队成员Jonathan Katz 表示,“全球开源社区的共同努力铸就了每一次PostgreSQL 版本的发布,并持续带来符合用户数据场景的功能。PostgreSQL 18 延续了该项目长久以来提供可靠、稳健数据管理体验的深厚传统,并进一步扩展了其可支持的工作负载范围。”
PostgreSQL是一个创新的数据管理系统,以其可靠性和健壮性著称,得益于全球开发者社区近30年的开源开发,已经成为各种规模组织的首选开源关系型数据库。
异步I/O 简介
PostgreSQL此前依赖操作系统的预读机制来加速数据检索。然而,操作系统无法感知数据库特有的访问模式,难以准确预测所需数据,导致在许多工作负载场景下性能欠佳。
PostgreSQL 18引入了新的异步I/O (AIO) 子系统来解决这一局限。AIO 允许PostgreSQL 并发地发出多个I/O 请求,而不是等待每个请求顺序完成,从而增强了现有的预读能力并提高整体吞吐量。PostgreSQL 18 支持的AIO 操作包括顺序扫描、位图堆扫描和清理(VACUUM)。基准测试显示,在某些场景下性能提升高达3 倍。
新的io_method参数允许用户在 worker
和 io_uring
等AIO 方法之间切换,也可以通过设置 sync
参数保持PostgreSQL 现有行为。AIO 带来了更丰富的调优维度,详细配置请参考官方文档。
升级提速且性能跃升
PostgreSQL的一项关键特性是生成并存储统计信息,有助于PostgreSQL 选择最优的查询计划。在PostgreSQL 18 之前,这些统计信息无法在主版本升级过程中保留,导致高负载系统在ANALYZE完成前查询性能骤降。PostgreSQL 18 引入了在主版本升级时保留规划器统计信息的能力,这有助于升级后的集群更快地达到预期性能。
此外,主版本升级工具pg_upgrade在PostgreSQL 18 中迎来多项增强,例如当数据库包含大量表和序列等对象时,升级速度显著提升。此版本还支持通过 --jobs
参数配置并行检查,并新增了 --swap
参数,通过直接交换升级目录的方式替代原有的复制、克隆或链接文件操作。
查询与整体性能提升
PostgreSQL 18通过一系列能自动提升工作负载速度的功能,进一步提升了查询性能。此版本引入了对多列 B-tree 索引上的“跳跃扫描”查找,可缩短在查询中省略一个或多个前缀索引列等值(=
)条件时的执行时间。它还可以优化 WHERE
子句中使用 OR
条件的查询,使其有效利用索引,大幅提升执行速度。此外,PostgreSQL 对表连接的执行计划和处理进行了多项改进,包括提升哈希连接性能、允许合并连接使用增量排序等。PostgreSQL 18 还支持GIN 索引的并行构建,与B-tree 和BRIN 索引索引一样具备该能力。
该版本还进一步增强了PostgreSQL 对硬件加速的支持,包括为 popcount
函数添加对ARM NEON 和SVE CPU 内置指令集的支持,该函数被bit_count和其他内部功能使用。
提升开发者体验
PostgreSQL 18引入了虚拟生成列,其数值在查询时实时计算而非直接存储,现已成为生成列的默认选项。此外,存储型生成列现已支持逻辑复制。
该版本新增了在RETURNING 子句中同时访问修改前(OLD
)与当前(NEW
)数值的能力,适用于 INSERT
、UPDATE
、DELETE
和 MERGE
命令。PostgreSQL 18 还通过uuidv7()函数新增了UUIDv7 生成功能,可生成按时间戳排序的随机UUID,有助于优化缓存策略。uuidv4()也作为 gen_random_uuid()
的别名被引入到PostgreSQL 18 。
PostgreSQL 18新增了对时间范围约束的支持:通过 WITHOUT OVERLAPS
子句,可在主键(PRIMARY KEY
)和唯一(UNIQUE
)约束中定义不重叠的范围;通过PERIOD 子句,可为外键(FOREIGN KEY
)约束定义时间区间关系。
最后,PostgreSQL 18引入了CREATE FOREIGN TABLE ... LIKE命令,可依据本地表的定义更便捷地创建外部表的模式结构。
文本处理增强
PostgreSQL 18通过多项新特性使文本处理更简单、更快速。此版本新增了PG_UNICODE_FAST排序规则,该规则在提供完整的Unicode大小写转换语义的同时,显著提升了多种比较操作的性能,涵盖 upper
和 lower
字符串比较函数,以及用于大小写不敏感比较的新casefold函数。此外,PostgreSQL 18 现在支持对使用非确定性排序规则的文本进行 LIKE
比较,简化了复杂模式匹配的实现。本版本还调整了全文检索的实现机制,使其采用数据库集群的默认排序提供程序,而非始终依赖libc,这一变化可能导致在运行pg_upgrade后,需要为所有全文检索及pg_trgm索引执行重建操作。
复制
PostgreSQL 18支持在日志和pg_stat_subscription_stats视图中报告逻辑复制写入冲突。此外,CREATE SUBSCRIPTION现默认使用并行流式方式来应用事务,有助于提升复制性能。pg_createsubscriber工具新增了 --all
参数,可以通过一条命令为实例中的所有数据库创建逻辑副本。PostgreSQL 18 持自动删除空闲复制槽,避免在发布服务器上积压过多WAL日志。
维护与可观测性
PostgreSQL 18改进了vacuum策略,通过在常规vacuum 期间主动冻结更多页面来减少开销,并在需要激进清理的情况下提供了帮助。
PostgreSQL 18为EXPLAIN命令提供了更详细的执行信息,自此版本起,在执行 EXPLAIN ANALYZE
时会自动显示访问的缓冲区数量(数据存储的基本单位)。此外,EXPLAIN ANALYZE
现在会显示索引扫描期间发生的索引查找次数,而 EXPLAIN ANALYZE VERBOSE
则会包含CPU、WAL 和平均读取统计信息。PostgreSQL 18 还在pg_stat_all_tables视图增加了有关VACUUM 及相关操作耗时统计,以及按连接统计的I/O 和WAL 使用情况数据。
其他重要变更
通过PostgreSQL 18 initdb初始化的数据库, 现在默认启用页校验和(page checksums)。这会影响从未启用校验和的集群升级,在使用pg_upgrade时需要使用 --no-data-checksums
参数创建一个新的PostgreSQL 18 集群。
PostgreSQL 18推出了新版(3.2)的PostgreSQL通信协议,这是自2003年PostgreSQL 7.4发布以来的首个重大更新。目前,libpq库仍默认使用3.0版本协议,而客户端工具(如驱动程序、连接池、代理服务器等)将逐步增加对新协议版本的支持。
其他功能
PostgreSQL 18还新增了许多其他新功能和改进,这些可能对您的使用场景有所帮助。请查看发布说明,以获取完整的新功能和更改列表。
为您推荐相关文章:
同类文章推荐: