今日,PostgreSQL 全球开发组宣布发布 PostgreSQL 18,这是全球最先进开源数据库的最新版本。本新闻稿的翻译版本可在 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 年的开源开发,已成为所有规模组织的优选开源关系数据库。
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 中包含多项增强功能,例如在数据库包含大量对象(如表和序列)时,升级速度更快。此版本还允许 pg_upgrade
根据 --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 引入了 虚拟生成列,它们在查询时计算值而不是存储它们。这是生成列的默认选项。此外,已存储的生成列现在可以进行逻辑复制。
此版本为 INSERT
、UPDATE
、DELETE
和 MERGE
命令的 RETURNING
子句 添加了访问先前值 (OLD
) 和当前值 (NEW
) 的能力。PostgreSQL 18 还通过 uuidv7()
函数支持 UUIDv7 生成,允许您生成时间戳排序的随机 UUID,以支持更好的缓存策略。PostgreSQL 18 将 uuidv4()
作为 gen_random_uuid()
的别名。
PostgreSQL 18 为 PRIMARY KEY
和 UNIQUE
约束添加了 时间范围约束(范围上的约束),使用 WITHOUT OVERLAPS
子句;为 FOREIGN KEY
约束添加了时间范围约束,使用 PERIOD
子句。
最后,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 模式 的验证,并添加了用于配置服务器端 TLS v1.3 密码套件的 ssl_tls13_ciphers
参数。
此版本弃用了 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 ANALYZE
时访问了多少缓冲区(数据存储的基本单位)。此外,EXPLAIN ANALYZE
现在显示在索引扫描期间发生了多少索引查找,而 EXPLAIN ANALYZE VERBOSE
则包括 CPU、WAL 和平均读取统计信息。PostgreSQL 18 在 pg_stat_all_tables
中包含更多有关 vacuum 和相关操作所花费时间的信息,以及每个连接的 I/O 和 WAL 利用率的统计信息。
使用 PostgreSQL 18 initdb
初始化的数据库现在默认启用页面校验和。这可能会影响从未启用校验和的集群升级,使用 pg_upgrade
时,您需要创建一个新的 PostgreSQL 18 集群并带有 --no-data-checksums
选项。
PostgreSQL 18 还引入了新版本的 PostgreSQL 线协议(3.2 版本),这是自 PostgreSQL 7.4(2003 年)以来的第一个新协议版本。libpq
默认仍使用 3.0 版本,而客户端(例如驱动程序、连接池、代理)将支持新协议版本。
PostgreSQL 18 还添加了许多其他新功能和改进,这些功能也可能对您的用例有所帮助。请参阅 发行说明 以获取新功能和更改功能的完整列表。
PostgreSQL 是全球最先进的开源数据库,拥有由成千上万的用户、贡献者、公司和组织组成的全球社区。自 40 多年前在加州大学伯克利分校起源以来,PostgreSQL 一直保持着无与伦比的发展步伐。PostgreSQL 成熟的功能集不仅可以与顶级专有数据库系统相媲美,而且在高级数据库功能、可扩展性、安全性和稳定性方面甚至超越了它们。