~/journal/2025/10/postgresql-18-rails-uuidv7

PostgreSQL 18 与 Rails:兼容性及原生 UUIDv7

从 Rails 开发者的视角看 PostgreSQL 18 的发布:ActiveRecord 兼容补丁与内置的原生 uuidv7() 支持。

发布
阅读时间
2 分钟
标签
PostgreSQLRails

本页由 AI 从原文翻译。

PostgreSQL 18 已发布,带来了性能(异步 I/O 子系统)和开发者体验方面的多项显著改进。

对于 Rails 开发者而言,上游社区迅速行动,确保 ActiveRecord 的兼容性。以下是与 Rails 应用最相关的亮点。

ActiveRecord 中的 Rails 支持

Rails 合并了两个关键拉取请求,以开箱即用地支持 PostgreSQL 18:

  • **rails/rails#55784**:更新 PostgreSQL 适配器的版本检测,以正确识别 PG18 并防止版本不匹配。
  • **rails/rails#55142**:新增对 PostgreSQL 18 内部 OID(对象标识符)类型的识别,使 ActiveRecord 能平滑处理新列类型。

原生 uuidv7() 支持

对 Rails 应用来说,最令人兴奋的新增功能是 PostgreSQL 18 的原生 uuidv7() 函数。

传统上,在 Rails 中使用 UUID 需要以下之一:

  • 随机 UUIDv4(由于缺乏顺序性,会导致 B-tree 索引碎片化),或
  • 第三方扩展如 pgcrypto,或应用层 UUIDv7 生成 gem。

UUIDv7 在标识符开头嵌入毫秒时间戳,使 ID 在保持唯一性的同时可按序排序。随着 PostgreSQL 18 在核心中原生支持 uuidv7():

  • 主键索引插入保持聚簇和顺序性(避免 B-tree 中的页分裂)。
  • 无需外部数据库扩展或应用回调即可生成时间有序的 UUID。
sql
-- In PostgreSQL 18
SELECT uuidv7();

其他值得注意的 PG18 变更

  • 异步 I/O(AIO):顺序和位图堆扫描的并行 I/O 请求,显著加速大型分析查询和 vacuum 操作。
  • 查询优化:多列 B-tree 索引的跳过扫描,以及 GIN 索引的改进并行构建。
  • 更快的升级:优化器统计信息在 pg_upgrade 过程中得以保留,减少大版本升级后的预热延迟。

总结

得益于最近的补丁,ActiveRecord 已能干净地处理 PG18。如果你的 Rails 应用正在使用或计划采用 UUID 主键,原生 uuidv7() 支持本身就足以让测试 PostgreSQL 18 成为值得的升级路径。

Epona
作者Epona

There's nothing wrong with having a little fun

x.com/simura_epona

相关文章

正在加载评论…