PostgreSQL 17 发布:摊牌了,我不装了!

一年一度的 PostgreSQL 大版本发布来了!这次的 PostgreSQL 17 ,又给我们带来了什么惊喜呢?

在这次大版本发布注记中, PostgreSQL 全球社区直接摊牌了 —— 不好意思,我不装了 —— “现在PG就是世界上最先进的开源数据库,已经是各种规模组织的首选开源数据库了”。虽然没有指名道姓,但官方已经无限接近喊出“干翻顶级商业数据库”(Oracle)的口号了。

news.webp

在年初发表的 《PostgreSQL 正在吞噬数据库世界》中,我提出 可扩展性 是 PostgreSQL 独一无二的核心优势。 很高兴地看到这一点在短短半年中,就成为了 PostgreSQL 社区的关注焦点与共识,并在 PGCon.Dev 2024 与本次 PostgreSQL 17 发布中得到充分的体现。

关于新特性,我先前在 《PostgreSQL 17 Beta1 发布!牙膏管挤爆了!》中已经有过介绍,在此就不再赘述了。 这个大版本有很多新特性,当然要说最让我印象深刻的是, PG竟然能在原本就已经非常强悍的性能 基础上让写入吞吐再次翻倍 —— 朴实无华的强悍

但比起具体的功能特性,我认为 PG 社区最大的转变发生在心态与精神上 —— 在这次发布通告中,PostgreSQL 去掉了原本 Slogan “世界上最先进的开源关系型数据库” 中的 “关系型” 三个字定语,直接变成了 “世界上最先进的开源数据库”。 并且在最后 “关于PostgreSQL” 的部分说到:“PG 的功能集,高级特性,可扩展性,安全性,稳定性已经比肩甚至超越了顶级商业数据库”。所以我想 “开源” 这个定语用不了多久也许就可以一同去掉,变成 “世界上最先进的数据库” 了。

PostgreSQL 这头巨兽已经觉醒了 —— 它不再是过去那种佛系与世无争的样子,精神面貌焕然一新,转换为一种积极进取的姿态 —— 它已经做好了接管与征服整个数据库世界的心理建设与动员准备。 而无数资本也已经涌入 PostgreSQL 生态,PG 系的 Startup 几乎拿走了数据库领域融资的全部 New Money。PostgreSQL 势必成为数据库领域一统天下的 “Linux 内核,DBMS 的纷争也许在未来会内化为 PostgreSQL 发行版内战,就让我们拭目以待吧。

eco.png


原文:PostgreSQL 17 发布注记

PostgreSQL 全球开发组 今天正式(2024-09-26)宣布了 PostgreSQL 17 的正式发布,这是世界上最先进的开源数据库的最新版本。

备注:是的,“关系型”定语已经去掉了,就是世界上最先进的开源数据库

PostgreSQL 17 建立在数十年的开源开发模式基础上,在不断提升性能与可伸缩性的同时,也在不断适应数据访问与存储的新兴模式。 本次 PostgreSQL 发布带来了显著的整体性能提升,例如,VACUUM 内存管理的彻底改进、存储访问优化、高并发工作负载改进、批量加载与导出加速、以及索引查询执行的改进等。 PostgreSQL 17具备能够同时惠及新型工作负载和关键核心系统的特性,例如:新增的 SQL/JSON 的 JSON_TABLE 命令改善了开发者体验;而对逻辑复制的改进,则简化了高可用架构与大版本升级的管理负担。

PostgreSQL 核心团队成员 Jonathan Katz 表示:“PostgreSQL 17 展现了全球开源社区如何协同构建,改善功能,帮助位于数据库旅途中不同阶段的用户”。“无论是针对大规模数据库运维的改进,还是基于卓越开发者体验的新特性,PostgreSQL 17 都将为您带来更好的数据管理体验。”

PostgreSQL 是一款以可靠性、稳健性和可扩展性著称的创新型数据管理系统,受益于全球开发者社区超过 25 年的开源开发,已成为各类组织的首选开源关系型数据库


系统性能的全面提升

PostgreSQL 的 vacuum 进程对于系统健康运行至关重要,然而 vacuum 操作是需要消耗服务器实例资源的。PostgreSQL 17 引入了一种新的 vacuum 内部内存结构,内存消耗量降至原本的 1/20。这不仅提高了 vacuum 的速度,还减少了对共享资源的占用,为用户的工作负载释放出更多可用资源。

PostgreSQL 17 也继续在 I/O 层面上不断优化性能。由于对预写日志(WAL)处理的改进,高并发工作负载的写入吞吐量可能有高达两倍的提升。此外,新的流式 I/O 接口加快了顺序扫描(读取表中所有数据)以及 ANALYZE 更新 Planner 所需统计信息的速度。

PostgreSQL 17 也在查询执行方面改善了性能。对于使用 B-tree 索引(PostgreSQL 默认的索引方法)的 IN 子句查询,性能有所提高。此外,BRIN 索引现在支持并行构建。 PostgreSQL 17 在查询规划方面进行了多项改进,包括对 NOT NULL 约束的优化,以及对 CTE(WITH 查询)处理的改进。本次发布中,使用 SIMD(单指令多数据)加速计算得到了更广泛地应用,例如在 bit_count 函数中使用 AVX-512 指令。


进一步丰富的开发者体验

PostgreSQL 是 第一个添加 JSON 支持的关系型数据库(2012年),而 PostgreSQL 17 进一步完善了对 SQL/JSON 标准的实现。JSON_TABLE 特性现已在 PostgreSQL 17 中可用 —— 它允许开发者将 JSON 数据转换为标准的 PostgreSQL 表。 PostgreSQL 17 现在支持 SQL/JSON 标准的 构造函数JSONJSON_SCALARJSON_SERIALIZE)和 查询函数JSON_EXISTSJSON_QUERYJSON_VALUE),为开发者提供了更多种类的与 JSON 数据交互的方式。 本次发布添加了更多种类的 jsonpath 表达式,重点是将 JSON 数据转换为原生的 PostgreSQL 数据类型,包括数值、布尔值、字符串和日期/时间类型。

PostgreSQL 17 为 MERGE (带条件版本的 UPDATE)添加了更多功能,包括 RETURNING 子句,和更新 视图 的能力。 此外,PostgreSQL 17 中批量加载与导出数据的能力得到加强,例如,在使用 COPY 命令导出大量数据时,性能提升高达两倍。当源端和目标编码匹配时,COPY 性能也有所提升,而且 COPY 命令包含一个新选项 ON_ERROR,允许在插入错误时继续导入。

此次发布还扩展了对分区数据和分布在远端 PostgreSQL 实例上的数据的管理功能。PostgreSQL 17 支持在分区表上使用标识列(Identity Columns)和 EXCLUDE 约束。 用于在远程 PostgreSQL 实例上执行查询的 PostgreSQL 外部数据源包装器(postgres_fdw)现在可以将 EXISTSIN 子查询下推到远程服务器,以实现更高效的处理。

PostgreSQL 17 还包含一个内置的、平台无关的、不可变的排序规则提供者,以确保排序规则的不可变性,并提供了类似于 C 排序规则的排序语义,但使用 UTF-8 编码而非 SQL_ASCII。使用这个新的排序规则提供者,可以保证您的文本查询无论在哪里的 PostgreSQL 上运行,都能返回相同的排序结果。


针对高可用与大版本升级的逻辑复制改进

在许多用例中,逻辑复制 用于实时传输数据。 然而,在 17 版本之前,想要执行大版本升级的用户必须先删除掉逻辑复制槽,并需要在升级后将数据重新同步到订阅者。 从 PostgreSQL 17 开始,用户不需要先删除逻辑复制槽了,因而简化了使用逻辑复制时的大版本升级过程。

PostgreSQL 17 现在包含了针对逻辑复制的故障切换能力,使其在高可用环境中部署时更为可靠。 此外,PostgreSQL 17 引入了命令行工具 pg_createsubscriber,用于将物理从库转换为一个新的逻辑从库。


更多面向安全与运维的管理选项

PostgreSQL 17 进一步扩展了用户对数据库系统全生命周期的管理能力。PostgreSQL 提供了一个新的 TLS 选项 sslnegotiation,允许用户在使用 ALPN(在 ALPN 目录中注册为 postgresql)时执行直接 TLS 握手。 PostgreSQL 17 还添加了 预置角色 pg_maintain,赋予普通用户执行维护操作的权限。

PostgreSQL 自带的备份工具 pg_basebackup 现在支持增量备份,并添加了命令行功能程序 pg_combinebackup 用于重建全量备份。 此外,pg_dump 新增了一个名为 --filter 的选项,允许您在生成转储文件时,选择要包含的对象。

PostgreSQL 17 还增强了监控和分析功能。EXPLAIN 命令现在会显示本地块读写I/O耗时,并包含两个新选项:SERIALIZEMEMORY,可以显示用于网络传输的数据转换耗时以及使用的内存量。 PostgreSQL 17 现在还会报告 索引 VACUUM 的进度, 并添加了新的系统视图 pg_wait_events,在与 pg_stat_activity 视图结合使用时可以更深入地了解活动会话的等待原因。


其他功能

PostgreSQL 17 中还添加了许多其他新功能和改进,可能会对您的用例有所帮助。请参阅 发行注记 以查阅新功能和变更的完整列表。


关于 PostgreSQL

PostgreSQL 是全世界最先进的开源数据库,拥有着一个由成千上万的用户、贡献者、公司和组织组成的全球社区。它始于加州大学伯克利分校,有着超过 35 年的工程与开发历史。 PostgreSQL 以无与伦比的开发速度持续发展:PostgreSQL 提供成熟的功能集不仅比肩能顶级的专有商业数据库系统,在高级数据库功能、可扩展性、安全性和稳定性方面上甚至超越了它们。

译注:说的就是你呀,Oracle


关于 Pigsty

顺带一提,紧随 PostgreSQL 17 发布的 Pigsty v3.0.3 已经正式支持使用 PostgreSQL 17 内核,欢迎试用。

Pigsty 是开源免费,本地优先,开箱即用的 PostgreSQL RDS,允许用户在本地一键拉起生产级的 PG 云数据库服务,并带有开箱即用的 336 个PG扩展插件,故障自愈的高可用,顶级监控系统,PITR备份恢复,IaC命令行工具,SOP管理预案的完整解决方案。

pigsty-home.png


其他参考阅读

德哥在他的博客中已经解读了许多关于 PostgreSQL 17 的新功能特性,是进一步了解 PostgreSQL 17 新功能特性的好资源:

PostgreSQL 17 正式发布, 要不要升?

支持块级别增量备份与恢复:

  • 《PostgreSQL 17 preview - 内置块级别物理增量备份(INCREMENTAL backup/pg_combinebackup)功能》
  • 《PostgreSQL 17 preview - Add new pg_walsummary tool》
  • 《PostgreSQL 17 preview - Add new function pg_get_wal_summarizer_state() 分析为聚合入 pg_wal/summaries 的pid内存中的wal片段信息》
  • 《PostgreSQL 17 preview - 增量备份patch: Add the system identifier to backup manifests》

支持逻辑复制failover、switchover:

  • 《PostgreSQL 17 preview - pg_upgrade大版本升级支持保留逻辑订阅全部信息 (preserve the full subscription’s state)》
  • 《PostgreSQL 17 preview - 主库视图 pg_replication_slots.conflict_reason 支持逻辑复制冲突原因跟踪》
  • 《PostgreSQL 17 preview - 支持逻辑复制槽failover to 流复制standby节点. pg_create_logical_replication_slot(... failover = true|false ...)
  • 《PostgreSQL 17 preview - preparation for replicating unflushed WAL data》
  • 《PostgreSQL 17 preview - sync logical replication slot LSN, Failover & Switchover》
  • 《PostgreSQL 17 preview - Add a new slot sync worker to synchronize logical slots》
  • 《PostgreSQL 17 preview - 增加GUC standby_slot_names , 保证这些standby已接收并flush所有逻辑slot向下游发送逻辑数据对应的WAL》
  • 《PostgreSQL 17 preview - pg_createsubscriber支持将物理从库转换为逻辑从库》
  • 《PostgreSQL 17 preview - 跟踪slot断联时间戳pg_replication_slots.inactive_since

支持COPY错误处理:

  • 《PostgreSQL 17 preview - Add new COPY option SAVE_ERROR_TO (copy跳过错误行)》
  • 《PostgreSQL 17 preview - pg_stat_progress_copy Add progress reporting of skipped tuples during COPY FROM》
  • 《PostgreSQL 17 preview - COPY LOG_VERBOSITY notice ERROR信息》

JSON类型处理能力增强:

  • 《PostgreSQL 17 preview - Implement various jsonpath methods》
  • 《PostgreSQL 17 preview - JSON_TABLE: Add support for NESTED paths and columns》

vacuum性能改进:

  • 《PostgreSQL 17 preview - 增加index vacuum 进度打印》
  • 《PostgreSQL 17 preview - Optimize vacuuming of relations with no indexes 降低wal产出》
  • 《PostgreSQL 17 preview - 解除vacuumdb,clusterdb,reindexdb的某些options组合限制》
  • 《PostgreSQL 17 preview - 使用TidStore数据结构存储dead tupleids, 提升vacuum效率, 为什么PG单表不建议超过8.9亿条记录?》
  • 《PostgreSQL 17 preview - vacuum_buffer_usage_limit调大默认值, 减少vacuum造成的wal flush, 提升vacuum速度》

index 性能优化:

  • 《PostgreSQL 17 preview - Allow Incremental Sorts on GiST and SP-GiST indexes》
  • 《PostgreSQL 17 preview - btree index backward scan (order by desc 场景)优化》
  • 《PostgreSQL 17 preview - Allow parallel CREATE INDEX for BRIN indexes》

高并发锁竞争优化:

  • 《PostgreSQL 17 preview - 优化wal insert lock, 提升高并发写入吞吐性能》
  • 《PostgreSQL 17 preview - Reduce rate of walwriter wakeups due to async commits》
  • 《PostgreSQL 17 preview - WAL锁竞争优化 - reading WAL buffer contents without a lock, Additional write barrier in AdvanceXLInsertBuffer()》

性能优化:

  • 《PostgreSQL 17 preview - 函数parser阶段优化, 函数guc into lists避免parser》
  • 《PostgreSQL 17 preview - 删除snapshot too old特性, 将引入新实现方式》
  • 《PostgreSQL 17 preview - postgres_fdw 支持semi-join pushdown (exists (…))》
  • 《PostgreSQL 17 preview - 将unstable hashfunc剥离, 提升in-memory场景哈希计算性能和算法自由度》
  • 《PostgreSQL 17 preview - 优化器增强, group by支持Incremental Sort, GUC: enable_group_by_reordering》
  • 《PostgreSQL 17 preview - 引入新的smgr, 优化bulk loading》
  • 《PostgreSQL 17 preview - Add --copy-file-range option to pg_upgrade
  • 《PostgreSQL 17 preview - 减少分区表partitionwise join内存消耗》
  • 《PostgreSQL 17 preview - 使用 Merge Append 提升 UNION 性能》
  • 《PostgreSQL 17 preview - pg_restore --transaction-size=N 支持N个对象封装为一个事务提交》

新增GUC参数:

  • 《PostgreSQL 17 preview - Add GUC: event_triggers . for temporarily disabling event triggers》
  • 《PostgreSQL 17 preview - Allow ALTER SYSTEM to set unrecognized custom GUCs.》
  • 《PostgreSQL 17 preview - XX000 内部错误 backtrace, add GUC backtrace_on_internal_error》
  • 《PostgreSQL 17 preview - allow_alter_system GUC控制 是否允许alter system 修改postgresql.auto.conf
  • 《PostgreSQL 17 preview - 新增 GUC: or_to_any_transform_limit 控制OR to ANY转换》
  • 《PostgreSQL 17 preview - 新增 GUC trace_connection_negotiation : 跟踪客户端 SSLRequest or GSSENCRequest packet》

SQL语法、函数功能增强:

  • 《PostgreSQL 17 preview - plpgsql 支持定义 %TYPE %ROWTYPE 数组变量类型》
  • 《PostgreSQL 17 preview - 支持修改生成列表达式 alter table ... ALTER COLUMN ... SET EXPRESSION AS (express)
  • 《PostgreSQL 17 preview - Support identity columns in partitioned tables》
  • 《PostgreSQL 17 preview - 简化exclude约束用法, 对primary key,unique约束增加without overlaps可选项》
  • 《PostgreSQL 17 preview - Add RETURNING support to MERGE》
  • 《PostgreSQL 17 preview - 增加uuid功能函数: 提取UUID值里面的时间戳 和 生成UUID值的函数版本》
  • 《PostgreSQL 17 preview - 新增返回某个范围内的随机数的随机函数random(min, max)
  • 《PostgreSQL 17 preview - Add support for MERGE ... WHEN NOT MATCHED BY SOURCE
  • 《PostgreSQL 17 preview - 使用pg_basetype 获得domain类型的基础类型》
  • 《PostgreSQL 17 preview - Implement ALTER TABLE ... MERGE|SPLIT PARTITION … command》

管理手段增强:

  • 《PostgreSQL 17 preview - 内置支持login event trigger》
  • 《PostgreSQL 17 preview - Add tests for XID wraparound》
  • 《PostgreSQL 17 preview - pgbench工具新增meta语法syncpipeline, pgbench: Add \syncpipeline
  • 《PostgreSQL 17 preview - 引入MAINTAIN权限及pg_maintain预制角色》
  • 《PostgreSQL 17 preview - 新增 “builtin” collation provider》
  • 《PostgreSQL 17 preview - 通过pg_wal_replay_wait()支持读写分离pool实现跨实例的读写一致性》
  • 《PostgreSQL 17 preview - transaction_timeout》

内部统计信息、系统视图增强:

  • 《PostgreSQL 17 preview - Add new parallel message type to progress reporting.》
  • 《PostgreSQL 17 preview - Add system view pg_wait_events》
  • 《PostgreSQL 17 preview - Add JIT deform_counter》
  • 《PostgreSQL 17 preview - 添加checkpoint delay等待事件》
  • 《PostgreSQL 17 preview - Add local_blk_{read|write}_time I/O timing statistics for local blocks》
  • 《PostgreSQL 17 preview - Introduce pg_stat_checkpointer》
  • 《PostgreSQL 17 preview - improve range type pg_stats》
  • 《PostgreSQL 17 preview - 增强standby节点检查点统计信息》
  • 《PostgreSQL 17 preview - Add EXPLAIN (MEMORY) to report planner memory consumption》

table access method 接口增强:

  • 《PostgreSQL 17 preview - Add support for DEFAULT in ALTER TABLE .. SET ACCESS METHOD
  • 《PostgreSQL 17 preview - 支持修改分区表access method》
  • 《PostgreSQL 17 preview - 寻找undo-based table access methods的蛛丝马迹》
  • 《PostgreSQL 17 preview - 频繁提交table access method相关patch, undo-based table access methods真的快来了吗?》
  • 《PostgreSQL 17 preview - table AM增强: Custom reloptions for table AM》

扩展接口能力增强:

  • 《PostgreSQL 17 preview - 增加alter table部分属性hook, 未来可定制化审计功能》
  • 《PostgreSQL 17 preview - 支持自定义等待事件》
  • 《PostgreSQL 17 preview - Introduce the dynamic shared memory registry (DSM 注册器)》
  • 《PostgreSQL 17 preview - 新增代码注入功能(enable-injection-points), 类似hook.》
  • 《PostgreSQL 17 preview - 引入读写原子操作函数接口with full barrier semantics》
  • 《PostgreSQL 17 preview - 支持在申请时指定动态共享内存区域初始、最大段size》
  • 《PostgreSQL 17 preview - 代码注入(injection_points)功能增强, Introduce runtime conditions》

libpq协议增强:

  • 《PostgreSQL 17 preview - libpq: Add support for Close on portals and statements , 释放绑定变量语句入口(prepared statements)》
  • 《PostgreSQL 17 preview - 增加wire protocol头文件》
  • 《PostgreSQL 17 preview - libpq新增PQchangePassword()接口, 防止alter user修改密码时明文被记录在SQL活跃会话、log、pg_stat_statements中》
Last modified 2024-09-28: update blog index (557a801)