系统极客一直在努力
专注操作系统及软件使用技能

PostgreSQL 18 正式发布:性能跃升、开发者体验全面升级

PostgreSQL

PostgreSQL 18 正式发布!这次更新引入了全新的 I/O 子系统,为各类工作负载都带来了显著的性能提升。在存储读取场景下,性能提升甚至高达 3 倍,同时还拓展了索引能覆盖的查询范围。

新版本在主版本升级流程上进行了重点优化,不仅大幅缩短了升级时间,还解决了升级后需要性能预热的痛点,确保集群可以迅速恢复到最佳状态。

开发者们也能从 PostgreSQL 18 的新特性中受益。比如,支持在查询时动态计算值的虚拟生成列,还有能够生成有序 UUID、优化索引与读取性能的uuidv7()函数。

另外,PostgreSQL 18 还内置了对 OAuth 2.0 认证的支持,简化了与 SSO(单点登录)系统的集成。

简单来说,PostgreSQL 是一款以卓越的可靠性和稳健性著称的数据管理系统。历经全球开发者社区近 30 年的持续贡献与开源开发,它已经成为各类组织机构,甚至 Homelab 玩家的首选开源关系型数据库。

PostgreSQL 18 核心亮点解析

引入异步 I/O(AIO),实现吞吐量飞跃

在过去,PostgreSQL 依赖操作系统层面的预读(read-ahead)机制来加速数据检索。然而,操作系统并不能感知数据库独特的访问模式,因此难以精准预测所需数据,导致许多工作负载下的性能表现不尽如人意。

为了突破这一瓶颈,PostgreSQL 18 引入了全新的异步 I/O(AIO)子系统:

  • AIO 机制允许 PostgreSQL 并发提交多个 I/O 请求,而无需等待每个请求依次完成。从而大大增强了现有的预读能力,提升了整体吞吐量。
  • 在 PostgreSQL 18 中,顺序扫描、位图堆扫描以及清理(VACUUM)等操作均已支持 AIO。基准测试表明,在特定场景下,性能提升可高达 3 倍。
  • 新增的 io_method 参数让用户可以在不同的 AIO 实现(如workerio_uring)之间灵活切换,也可以通过设置为sync来保留旧有的同步 I/O 行为。

AIO 的引入为性能调优打开了新的维度,更多详细配置请参考官方文档

升级流程优化:更快、更稳、性能无缝衔接

PostgreSQL 的查询优化器依赖于其生成并存储的统计信息,来选择最优执行计划。

  • 在 PostgreSQL 18 之前,这些宝贵的统计数据在主版本升级过程中会丢失,导致高负载系统在完成 ANALYZE 操作之前,会面临查询性能急剧下降。
  • PostgreSQL 18 引入了一项关键改进,允许在主版本升级期间,保留这些规划器统计信息,确保升级后的集群能更快恢复到应有的性能水平。

与此同时,主版本升级工具 pg_upgrade 也得到了多项增强:

  • 当数据库中包含大量表、序列等对象时,升级速度显著提升。
  • 支持通过--jobs参数配置并行检查,并引入了全新的--swap参数。能通过直接交换新/旧数据目录的方式完成升级,取代了以往复制、克隆或链接文件的操作,进一步提升了效率。

查询性能再攀新高

PostgreSQL 18 通过一系列新功能,进一步优化了查询性能,能够自动加速多种工作负载:

  • 引入了对多列 B-tree 索引的「跳跃扫描」支持。当查询条件省略了一个或多个前导索引列时,该特性可以显著缩短查询时间。
  • 优化了WHERE子句中包含OR条件的查询,能够更高效地利用索引,大幅提升执行速度。
  • 对表连接的执行计划与处理,也进行了多项改进。包括提升哈希连接的性能,以及允许合并连接利用增量排序等。
  • PostgreSQL 18 现在也支持 GIN 索引的并行构建,与 B-tree 和 BRIN 索引同样具备这一高效能力。

新版本还进一步深化了对硬件加速的利用。例如,通过为popcount函数(被 bit_count 及其他内部功能调用)添加对 ARM NEON 与 SVE CPU 指令集的支持,相关计算效率得到了有效提升。

全方位提升开发者体验

PostgreSQL 18 正式引入了虚拟生成列,其数值在查询时,会实时计算而非预先存储,并已经成为生成列的默认类型。同时,原有的存储型生成列现在也支持逻辑复制。

  • 在 RETURNING 子句中,现在可以同时访问被修改前(OLD)与修改后(NEW)的数据,这一功能适用于INSERTUPDATEDELETEMERGE等命令,为开发带来了极大便利。
  • 通过新增 uuidv7() 函数,提供了生成 UUIDv7 的能力。这种 UUID 包含时间戳信息,能够按时间排序,有助于优化缓存策略并提升索引效率;此外,新版本还引入了 uuidv4() 作为gen_random_uuid()的别名,更加易于使用。

PostgreSQL 18 还增强了对时间范围约束的支持:

  • 通过WITHOUT OVERLAPS子句,用户可以在主键(PRIMARY KEY)和唯一(UNIQUE)约束中定义不重叠的时间范围。
  • 通过PERIOD子句,则可以为外键(FOREIGN KEY)约束定义时间区间关系。

最后,PostgreSQL 18 引入了 CREATE FOREIGN TABLE … LIKE 命令,允许开发者依据本地表的定义,便捷地创建结构相同的外部表。

文本处理能力迈上新台阶

PostgreSQL 18 通过多项新特性,让文本处理变得更简单、更高效:

  • 新增了 PG_UNICODE_FAST 排序规则,在提供完整 Unicode 大小写转换语义的同时,显著提升了多种比较操作的性能,包括upperlower字符串函数,以及新增的用于大小写不敏感比较的 casefold 函数。
  • 支持对采用非确定性排序规则的文本进行LIKE比较,简化了复杂模式的匹配逻辑。
  • 调整了全文检索的实现机制,使其采用数据库集群的默认排序提供程序,而不再依赖于 libc。需要注意的是,这一变化可能导致在执行 pg_upgrade 后,需要为所有全文检索索引以及 pg_trgm 索引执行重建操作。

逻辑复制功能增强

  • PostgreSQL 18 现在支持在日志和 pg_stat_subscription_stats 视图中,报告逻辑复制的写入冲突,提升了问题的可追溯性。
  • CREATE SUBSCRIPTION 命令现在默认采用并行流式方式应用事务,有助于提升复制性能。
  • pg_createsubscriber 工具也新增了--all参数,可以通过一条命令为实例中的所有数据库创建逻辑副本。
  • 为了防止发布服务器上 WAL 日志过度积压,PostgreSQL 18 还支持自动删除空闲的复制槽

运维与可观测性改进

  • PostgreSQL 18 优化了 vacuum 策略,通过在常规 vacuum 过程中主动冻结更多页面,来降低开销。同时,在需要进行激进清理时,提供了更有效的支持。
  • 为 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)的通信协议,这也是自 2003 年 PostgreSQL 7.4 发布以来的首次重大更新。目前,官方的 libpq 库仍然默认使用 3.0 版本协议,但各类客户端工具(如驱动、连接池、代理服务等)将逐步增加对新协议的支持。

PostgreSQL 18 还包含了许多其他新增功能与改进,能为你的特定应用场景带来帮助。欢迎查阅官方的发布说明,获取完整的新功能与变更列表。

赞(1)
分享到

评论 抢沙发