文章摘要
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使用。
(注:原文中的代码示例、图片引用等非核心内容已作简化处理,保留了关键的技术说明和测试结论)
评论总结
总结评论内容:
- 支持流水线/批处理的观点:
- 认为可以减少网络往返延迟,提高性能
- 建议将只读查询和写入查询分批执行 关键引用: "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)
- 驱动支持现状:
- 许多PostgreSQL驱动缺乏流水线模式支持
- 部分开发者开始关注并实现该功能 关键引用: "Most Postgres drivers don't even support batching, at least in the JavaScript world" (评论1) "I've created an issue for it" (评论2)
- 性能优化原理的讨论:
- 认为性能提升主要来自减少等待确认的时间
- 指出原解释中关于网络数据包的说法可能有误 关键引用: "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)
- 实际应用情况:
- 已有开发者实现了默认使用流水线模式的客户端
- 部分语言/框架尚不支持该功能 关键引用: "I developed a JS pg client that use pipeline mode by default" (评论4) "Sad I can't use this in Elixir" (评论6)