使用 Postgres 17 B 树批量扫描的实际世界性能增益 | Crunchy Data 博客

主要观点:Postgres 17 即将发布,其中一项重要改进是允许 Btree 索引更高效地查找一组值,通过Postgres 17 对 nbtree 的ScalaryArrayOp执行的增强,多值查找不再需要多次重复遍历。为测试该优化在真实应用中的效果,对支持Crunchy Bridge的 API 服务进行了测试,在 Go 语言编写的 API 中,通过两阶段加载和渲染技术减少 N+1 问题,测试了 Postgres 16 和 17 下的性能,发现从 Postgres 16 到 17 吞吐量提高约 30%,平均请求时间降低 20%。

关键信息

  • Postgres 17 即将发布,有众多功能、改进和优化
  • Btree 索引是 Postgres 最常用和优化最好的索引,用于表的主键或二级索引查找。
  • 之前多值查找需要多次重复遍历,现在ScalaryArrayOp改进可一起检索同一叶页上的多个值。
  • 测试的 API 是用 Go 编写的生产级程序,选择GET /teams/:id/members端点进行测试。
  • 加载团队成员页面及相关数据的查询模式,涉及多个数据库模型和id = any(...)的查找。
  • 使用go-wrk进行基准测试,测试了 Postgres 16 和 17 下的性能。
  • 测试结果显示从 Postgres 16 到 17 吞吐量提高约 30%,平均请求时间降低 20%。

重要细节

  • 团队成员包含自身的 ID 和角色,还嵌入了关联用户的账户详细信息。
  • 两阶段加载和渲染技术可批量加载所有渲染 API 资源所需的数据库记录。
  • 测试时生成了一个有 100 个团队成员/账户及相关记录的团队。
  • 基准测试持续 60 秒以补偿冷启动和缓存,考虑了非数据库工作的额外开销。
  • 测试结果以图表形式展示,直观地显示了性能提升。
  • 作者认为在使用类似 Rails 框架进行大量急切加载的应用中也会有类似的性能提升。
阅读 10
0 条评论