DBA 视角:Postgres 18 新版本,带来了哪些变化?

维权提醒:如果你或身边的朋友近五年内因投顾公司虚假宣传、诱导交费导致亏损,别放弃!立即联系小羊维权(158 2783 9931,微信同号),专业团队帮你讨回公道!


> 原文地址:https://www.bytebase.com/blog/what-is-new-in-postgres-18

PostgreSQL 于 2025 年 5 月 8 日宣布了 18 beta 1 版本的发布。虽然一些功能可能还会被移除,但值得一看。

异步 I/O

PostgreSQL 18 在底层引入了一个重大改进,即新的异步 I/O(AIO)子系统。根据官方的版本说明,此功能旨在提高 I/O 吞吐量并隐藏 I/O 延迟,可以通过 io_method 服务器变量启用。对于 Linux 用户,这意味着可以利用 io_uring,而且可在任意平台基于工作线程实现。原实现方式主要针对文件系统读取,包括顺序扫描、位图堆扫描和清理操作;新的系统视图 pg_aios 也将可显示用于 AIO 的文件句柄。

> 终于有 AIO 了!承诺某些读取操作 2-3 倍的性能改进,听起来很棒(对使用网络附加磁盘的云数据库来说,真的有可能)。 > > 不过别忘了,这只是针对读取的;不要指望你的写入密集型 OLTP 会一夜间神奇地加速。当然,AIO 仍是一个巨大的进步,如果没有引入新 I/O 错误的话。 > DBA Note

UUIDv7

PostgreSQL 18 为处理分布式系统或需要全局唯一、可排序标识符的开发者带来了对 UUIDv7 的原生支持。正如 PostgreSQL 18 Beta 1 发布公告中所强调的,新的 uuidv7() 函数允许生成按时间戳排序的 UUID。相比传统的 UUID(如 UUIDv4,uuidv4() 现在是 gen_rand_uuid() 的别名),这在数据库性能方面是一个重大改进,尤其是对于索引和缓存策略,因为按时间排序的特性可以带来更好的数据局部性并减少 B 树索引中的页面分裂。

> 现在,我们的主键就既可以全局唯一,又可以与索引很好地配合。迟到总比不到好。 > > DBA Note

改进的 EXPLAIN

EXPLAIN 命令在理解查询性能方面是 DBA 最好的朋友(有时也是最大的敌人)。PostgreSQL 18 为 EXPLAIN 的输出带来了几个正向的改进,使其更有洞察力。根据版本说明,EXPLAIN ANALYZE 现在将自动包含 BUFFERS 输出,省去了额外的关键字。此外,改进后的 EXPLAIN ANALYZE VERBOSE 将显示 WAL(预写日志)使用情况、CPU 统计信息和平均读取统计信息。EXPLAIN (WAL)VACUUM/ANALYZE (VERBOSE) 和自动清理日志输出中还添加了完整的 WAL 缓冲区计数。

> 也许,仅仅是也许,现在更多的开发者会真正查看缓冲区使用情况。VERBOSE 中的 WAL、CPU 和平均读取统计数据很有助于真正深入的分析;还有一个指标可以将自动清理跟不上的原因解释得一清二楚。 > > DBA Note

NOT NULL 约束作为 NOT VALID

PostgreSQL 18 引入了另一个对 schema 管理的有益改进,即能够将 NOT NULL 约束添加为 NOT VALID

此功能允许用户添加 NOT NULL 约束而无需立即扫描整个表,之后验证时也无需持有 ACCESS EXCLUSIVE 锁。这对于大表特别有价值,可以大量节省添加约束所需的停机时间。

这个新语法需要使用命名约束方法:

ALTER TABLE table_name ADD CONSTRAINT constraint_name NOT NULL (column) NOT VALID;

之后,可以使用以下方式验证约束:

ALTER TABLE table_name VALIDATE CONSTRAINT constraint_name;

在验证期间,PostgreSQL 只持有 ShareUpdateExclusiveLock,这意味着 SELECT、INSERT、UPDATE 和 DELETE 等正常操作可以在验证过程运行时继续工作。

即使 NOT NULL 约束被添加为 NOT VALID,它仍然阻止新的 NULL 值插入到列中。这为新行提供了即时的数据完整性,并允许在任何时候清理现有的 NULL 值。

> 这对于我们这些以每秒美元计算停机时间、管理大型生产数据库的人来说,简直是雪中送炭。我们不再需要为了给某个 10TB 的表添加 NOT NULL 约束而安排凌晨 3 点的维护窗口。被标记为无效时仍然阻止新的 NULL 值,这是完美的平衡:向前传递完整的数据,而不必立即验证。 > > DBA Note

RETURNING 中的 OLD/NEW 值

以前的 RETURNING 为 INSERT 和 UPDATE 返回新值,为 DELETE 返回旧值;MERGE 操作根据所执行的内部查询来返回值。新语法则更加灵活,允许 INSERT ON CONFLICT 和 UPDATE 返回旧值(以前 UPDATE 只有新值),DELETE 在 ON DELETE 行赋值产生新值时可能返回新值。可通过更改关系别名「old」和「new」来指定所需的值。

> 这很好地简化了应用程序逻辑。今后要获取前后对比,就不再需要处理繁复的 SELECT 语句或触发器了。 > > DBA Note

虚拟生成列

根据版本说明,PostgreSQL 18 改变了生成列的处理方式,「在读取时(而非写入时)计算其值」。有别于传统的 STORED 生成列,虚拟生成列成为了默认值;尽管STORED 选项仍然可用于需要显式写入时计算和存储的场合。PostgreSQL 18 Beta 1 还宣布,存储的生成列现在可以逻辑复制。

> 鉴于相当多的的全名或简单计算,对于从其他列派生且无需物理存储的列,这样会节省大量磁盘空间和写入开销。代价是读取时计算,意味着查询这些虚拟列可能受轻微的性能影响,特别是生成逻辑复杂的情况下;因此,存储的列可进行逻辑复制,是一个不错的补充。 > > DBA Note

主要版本升级体验

许多 DBA 升级 PostgreSQL 主要版本会有顾虑。

变更仍主要采取 pg_dumpall 后恢复、使用 pg_upgrade、逻辑复制等标准操作,但 PostgreSQL 18 将改善此过程的体验。

新版本说明强调了通过主要版本升级保持规划器统计信息的能力;新升级的集群可以更快达到预期的性能状态,而无需等待跨所有数据的 ANALYZE 运行。pg_upgrade 本身性能也有提升,包括其检查的并行处理(通过 --jobs 标志)和新的 --swap 标志(交换而非复制升级目录),在大型安装场景下可以节省大量时间。

当然,任何主要版本都需要注意兼容性问题。版本 18 的说明中列出了几个:时区缩写处理的变化、MD5 密码认证的弃用(终于!)、VACUUMANALYZE 处理继承的变化、COPY FROM 关于文件结束标记行为的修改等。升级之前彻底审查兼容性是至关重要的。

> 只要能消灭升级时那个可怕的维护窗口的,都是好东西。当然,不兼容性列表这个陷阱仍然存在,DBA 仍需要阅读细则、彻底测试,并保留一个可靠的回滚方案。升级仍然是 DBA 赚危险津贴的场合。 > > DBA Note


💡 更多资讯,请关注 Bytebase 公号:Bytebase

                                                                                </div>



Source link

未经允许不得转载:紫竹林-程序员中文网 » DBA 视角:Postgres 18 新版本,带来了哪些变化?

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
关于我们 免责申明 意见反馈 隐私政策
程序员中文网:公益在线网站,帮助学习者快速成长!
关注微信 技术交流
推荐文章
每天精选资源文章推送
推荐文章
随时随地碎片化学习
推荐文章
发现有趣的