Hacker News 中文摘要

RSS订阅

psql(PostgreSQL 18)中的流水线技术 -- Pipelining in psql (PostgreSQL 18)

文章摘要

PostgreSQL 18的psql命令行工具新增了管道查询功能,允许客户端无需等待前一条查询结果即可发送下一条查询,从而提升吞吐量。该功能通过并行处理客户端、网络和服务器的任务,并优化网络数据包传输来实现性能提升。虽然该功能自PostgreSQL 14起已通过libpq支持,但此次更新使得普通用户也能在SQL脚本中直接使用这一特性。

文章总结

PostgreSQL 18中的psql管道化功能解析

PostgreSQL的管道化是一项基于网络协议的客户端特性,它允许在不等待前序查询结果的情况下继续发送后续查询,从而通过两种方式提升吞吐量: 1. 实现客户端、网络和服务端的并行处理 2. 通过合并网络数据包减少总体传输量

这项技术自2003年的7.4版本(引入扩展查询协议)就已存在,但直到2021年的PostgreSQL 14才通过libpq客户端库实现应用。最新发布的PostgreSQL 18为命令行工具psql新增了管道化支持,虽然未列入主要特性,却能显著提升查询效率。

使用指南: - 通过\startpipeline开启管道 - 使用\syncpipeline设置同步点 - 通过\getresults获取结果集 - 以\endpipeline结束管道 - 管道操作会创建隐式事务,失败时自动回滚

性能测试: 在设备数据导入测试中(使用INSERT...ON CONFLICT语句),对比了不同网络环境下的表现: 1. 本地主机(延迟0.04ms):加速效果1.5-5倍 2. 局域网(延迟1ms):加速2.6-42倍
3. 广域网(延迟4ms):加速5.4-71倍

优势分析: - 相比传统批处理,管道化无需精心设计每批数据量 - 特别适合包含复杂客户端逻辑的场景 - 保持简单语句的易用性

兼容性说明: psql 18的新功能不要求服务端必须升级,旧版本PostgreSQL服务端也可配合新版psql使用。

(注:原文中的代码示例、图片引用等非核心内容已作简化处理,保留了关键的技术说明和测试结论)

评论总结

总结评论内容:

  1. 支持流水线/批处理的观点:
  • 认为可以减少网络往返延迟,提高性能
  • 建议将只读查询和写入查询分批执行 关键引用: "I feel pipelines (or batches) are slept upon... Network roundtrip is the biggest contributor to latency" (评论1) "activerecord in Rails has async mode...I wonder if using pipelining instead...would be a better approach" (评论3)
  1. 驱动支持现状:
  • 许多PostgreSQL驱动缺乏流水线模式支持
  • 部分开发者开始关注并实现该功能 关键引用: "Most Postgres drivers don't even support batching, at least in the JavaScript world" (评论1) "I've created an issue for it" (评论2)
  1. 性能优化原理的讨论:
  • 认为性能提升主要来自减少等待确认的时间
  • 指出原解释中关于网络数据包的说法可能有误 关键引用: "The performance improvement is not likely to be because you're sending larger packets...The speed up comes from removing waiting on a round trip" (评论5)
  1. 实际应用情况:
  • 已有开发者实现了默认使用流水线模式的客户端
  • 部分语言/框架尚不支持该功能 关键引用: "I developed a JS pg client that use pipeline mode by default" (评论4) "Sad I can't use this in Elixir" (评论6)