PostgreSQL 全球开发组今天宣布发布 PostgreSQL 18,这是全球最先进的开源数据库的最新版本。本新闻稿的多语言翻译版本可在 PostgreSQL 18 新闻资料包中获取。
PostgreSQL 18 通过全新的 I/O 子系统提升了各种规模工作负载的性能,在存储读取方面展现了高达 3 倍的性能提升,同时增加了可使用索引的查询数量。本版本使大版本升级的影响更小,加快了升级速度,并缩短了升级完成后达到预期性能所需的时间。开发者也将从 PostgreSQL 18 的新功能中受益,包括在查询时计算值的虚拟生成列,以及数据库友好的 uuidv7() 函数,为 UUID 提供更好的索引和读取性能。PostgreSQL 18 通过支持 OAuth 2.0 认证,使与单点登录(SSO)系统的集成变得更加简便。
"全球开源社区的努力塑造了每一个 PostgreSQL 版本,帮助交付满足用户数据需求的功能,"PostgreSQL 核心团队成员 Jonathan Katz 说道。"PostgreSQL 18 延续了该项目提供可靠且稳健的数据管理体验的悠久历史,同时持续拓展其可支持的工作负载范围。"
PostgreSQL 是一个创新的数据管理系统,以其可靠性、健壮性和可扩展性著称,受益于全球开发者社区近 30 年的开源开发,已成为各种规模组织首选的开源关系型数据库。
PostgreSQL 此前依赖操作系统的预读机制来加速数据检索。然而,由于操作系统缺乏对数据库特定访问模式的了解,无法总是准确预判所需数据,导致许多工作负载的性能表现不够理想。
PostgreSQL 18 引入了全新的异步 I/O(AIO)子系统来解决这一局限。AIO 允许 PostgreSQL 同时发起多个 I/O 请求,而非逐个等待完成。这扩展了现有的预读能力,提升了整体吞吐量。PostgreSQL 18 中支持 AIO 操作的场景包括顺序扫描、位图堆扫描和 vacuum。基准测试表明,在某些场景下性能提升可达 3 倍。
新增的 io_method 设置允许您在 AIO 方法之间切换,包括 worker 和 io_uring,或者您也可以通过 sync 设置保持当前的 PostgreSQL 行为。使用 AIO 时需要考虑更多的调优参数,您可以在文档中了解更多信息。
PostgreSQL 的一个关键功能是生成和存储统计信息,以帮助 PostgreSQL 选择最高效的查询计划。在 PostgreSQL 18 之前,这些统计信息在大版本升级时不会保留,这可能导致繁忙系统在 ANALYZE 运行完成之前出现严重的查询性能下降。PostgreSQL 18 引入了在大版本升级时保留规划器统计信息的功能,帮助升级后的集群更快地达到预期性能。
此外,pg_upgrade(用于执行大版本升级的工具)在 PostgreSQL 18 中进行了多项增强,例如当数据库包含大量对象(如表和序列)时升级速度更快。本版本还允许 pg_upgrade 根据 --jobs 参数的设置并行处理检查,并新增了 --swap 参数,可交换升级目录而非复制、克隆或链接文件。
PostgreSQL 18 通过自动加速工作负载的功能进一步提升了查询性能。本版本在多列 B-tree 索引上引入了"跳跃扫描"查找,提升了在一个或多个前缀索引列上省略 = 条件的查询的执行时间。它还能优化在 WHERE 中使用 OR 条件的查询以使用索引,从而显著加快执行速度。此外,PostgreSQL 在规划和执行表连接方面也有诸多改进,从提升 Hash Join 性能到允许 Merge Join 使用增量排序。PostgreSQL 18 还支持 GIN 索引的并行构建,与 B-tree 和 BRIN 索引一起支持此功能。
本版本还在 PostgreSQL 的硬件加速支持上进一步拓展,包括对 ARM NEON 和 SVE CPU 指令集的 popcount 函数支持,该函数被 bit_count 及其他内部功能所使用。
PostgreSQL 18 引入了虚拟生成列,在查询时计算值而非存储它们。这现已成为生成列的默认选项。此外,存储型生成列现在可以进行逻辑复制。
本版本新增了在 INSERT、UPDATE、DELETE 和 MERGE 命令的 RETURNING 子句中同时访问前值(OLD)和当前值(NEW)的能力。PostgreSQL 18 还通过 uuidv7() 函数新增了 UUIDv7 生成功能,让您能够生成按时间戳排序的随机 UUID,以支持更好的缓存策略。PostgreSQL 18 还包含 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 语义,同时有助于加速许多比较操作。这包括 upper 和 lower 字符串比较函数以及用于不区分大小写比较的新函数 casefold。此外,PostgreSQL 18 现在支持对使用非确定性排序规则的文本进行 LIKE 比较,简化了更复杂模式匹配的执行方式。本版本还将全文搜索改为使用集群的默认排序规则提供者,而非始终使用 libc,这可能需要您在运行 pg_upgrade 后重建所有全文搜索和 pg_trgm 索引。
PostgreSQL 18 引入了 oauth 认证,允许用户通过 PostgreSQL 扩展支持的 OAuth 2.0 机制进行认证。此外,PostgreSQL 18 还包含对 FIPS 模式的验证支持,并新增了 ssl_tls13_ciphers 参数用于配置服务器端 TLS v1.3 加密套件。
本版本弃用了 md5 密码认证方式,该方式将在未来版本中移除。如果您需要基于密码的 PostgreSQL 认证,请使用 SCRAM 认证。PostgreSQL 18 还支持通过 postgres_fdw 和 dblink 进行 SCRAM 透传认证,用于向远程 PostgreSQL 实例进行身份验证。此外,pgcrypto 现在支持用于密码哈希的 SHA-2 加密。
PostgreSQL 18 支持在日志和 pg_stat_subscription_stats 视图中报告逻辑复制写入冲突。此外,CREATE SUBSCRIPTION 现在默认使用并行流来应用事务,这有助于提升性能。pg_createsubscriber 工具现在提供了 --all 参数,可以通过单个命令为实例中的所有数据库创建逻辑副本。PostgreSQL 18 还允许自动删除空闲复制槽,以防止在发布者上存储过多的预写日志文件。
PostgreSQL 18 改进了 vacuum 策略,在常规 vacuum 过程中主动冻结更多页面,减少开销,并有助于应对需要激进 vacuum 的场景。
PostgreSQL 18 为 EXPLAIN 增添了更多细节。EXPLAIN 提供有关查询计划执行的信息,本版本起在执行 EXPLAIN ANALYZE 时会自动显示访问了多少缓冲区(数据存储的基本单位)。此外,EXPLAIN ANALYZE 现在还会显示索引扫描期间发生的索引查找次数,而 EXPLAIN ANALYZE VERBOSE 则包含 CPU、WAL 以及平均读取统计信息。PostgreSQL 18 在 pg_stat_all_tables 中增加了 vacuum 及相关操作的耗时信息,以及每个连接的 I/O 和 WAL 使用统计。
使用 PostgreSQL 18 initdb 初始化的数据库现在默认启用页面校验和。这可能会影响从未启用校验和的集群进行升级,在使用 pg_upgrade 时,需要使用 --no-data-checksums 选项创建新的 PostgreSQL 18 集群。
PostgreSQL 18 还引入了 PostgreSQL 线协议的新版本(3.2),这是自 PostgreSQL 7.4(2003 年)以来首个新的协议版本。libpq 默认仍使用 3.0 版本,同时客户端(如驱动程序、连接池、代理)正在添加对新协议版本的支持。
PostgreSQL 18 还新增了许多其他新功能和改进,可能对您的使用场景也有帮助。请参阅发布说明了解新增和变更功能的完整列表。
PostgreSQL 是全球最先进的开源数据库,拥有由数千名用户、贡献者、公司和组织组成的全球社区。PostgreSQL 起源于加州大学伯克利分校,历经 40 多年的发展,始终保持着无与伦比的开发速度。PostgreSQL 成熟的功能集不仅能够媲美顶级商业数据库系统,更在高级数据库功能、可扩展性、安全性和稳定性方面超越它们。