psql 中的流水线操作(PostgreSQL 18)

原文地址 https://postgresql.verite.pro/blog/2025/10/01/psql-pipeline.html

psql 中的流水线操作(PostgreSQL 18)
2025 年 10 月 1 日

Postgres 中的流水线是什么?
流水线是网络协议支持的一种客户端特性,其核心思想是:在发送下一条查询前,无需等待之前已发送查询的结果返回。这种方式通过两种途径提升吞吐量:

客户端、网络和服务器可以并行工作。例如,网络可能在传输第 (N-1) 条查询结果的同时,服务器正在执行第 N 条查询,而客户端正在发送第 (N+1) 条查询——所有这些操作同时进行。

网络利用率更高,因为连续的查询可以被分组到相同的网络数据包中,从而减少总体数据包数量。

流水线功能自 7.4 版本(2003 年发布)引入扩展查询协议后便成为可能。但直到 2021 年 PostgreSQL 14 发布,才可以通过客户端 C 库 libpq 使用该功能。此后,一些基于 libpq 的驱动程序(如 psycopg3)开始支持流水线。

上周发布的 PostgreSQL 18 中,命令行客户端 psql 新增了在 SQL 脚本中使用流水线操作的命令,使其变得更加易用。虽然这一新增功能并非该版本的突出特性,但它能显著提升查询吞吐量,我们将在下面的简单测试中看到这一点。

psql 命令
流水线操作以\startpipeline开始,在最简单的情况下,其后跟随 SQL 查询,并以\endpipeline结束。如果需要中间结果,可以使用\syncpipeline强制设置一个同步点,并使用\getresults获取到该点为止的所有结果。此外,启动流水线会创建一个隐式事务。如果某个查询失败,自开始(或上一个同步点)以来的所有更改都将被回滚。

如果你了解使用\;语法将多个查询分组到同一请求中的技术,那么它与流水线操作有相似之处:两者都用于减少服务器往返次数,并且在事务方面具有相同的语义。从某种意义上说,流水线操作是扩展查询协议中对简单查询协议中多语句查询(psql 中的\;)的演进。

性能测试
我们做一个简单的测试,使用INSERT ... ON CONFLICT查询导入设备数据。对于同一设备、同一日期的情况会更新行,否则插入新行。需要注意的是,如果我们想无条件追加所有行,使用COPY会更合适,流水线操作则非必需,因此本次测试选择了更复杂的插入或更新操作。

以下 bash 代码根据参数决定是否使用流水线来导入(随机生成的)数据。

functionimport_data{localcount=$1# 导入多少行?localpipeline=$2# 1 或 0localnow_ts=$(date+%s)(echo'PREPARE s AS insert into events(device, recorded_at, measure) values($1, to_timestamp($2), $3) on conflict(device,recorded_at) do update set measure=excluded.measure;'echo"BEGIN;"[[$pipeline=1]]&&echo"\\startpipeline"foriin$(seq1$count)dodevice=$RANDOMsecs=$(($now_ts+$RANDOM*50))measure=${RANDOM}"."${RANDOM}echo"execute s($device, '$secs',$measure);"done[[$pipeline=1]]&&echo"\\endpipeline"echo"COMMIT;")|$psql-q -vON_ERROR_STOP=1}

让我们尝试以 100、1000、5000、10000、50000、100000 行为批次,分别使用和不使用流水线操作,并比较这些批次的处理速度。

此外,由于网络速度在此处影响很大,我们将在三种典型的网络连接下进行测试:

  • 本地主机(ping 时间约 0.04ms):客户端和服务器在同一主机上。
  • 局域网(ping 时间约 1ms):客户端和服务器仅通过一个 1GB/s 的以太网交换机连接。
  • 广域网(ping 时间约 4ms):服务器通过公共互联网连接访问。

最后,每种情况运行 5 次,我们只取运行时间的中位数。

![本地主机性能对比图]

在同一主机上,流水线带来的加速效果从最小批次的 1.5 倍到最大批次的 5 倍不等。

![局域网性能对比图]

在局域网连接上,最小批次的加速效果是 2.6 倍,而较大批次则高达 42 倍。

![广域网性能对比图]

在最慢的网络(广域网)上,效果更加显著。加速比在 5.4 倍到 71 倍之间!

结论
这些加速效果表明,在没有流水线操作的情况下,当我们发送小查询批次时,网络利用率是多么不足:网络数据包就像载客 50 人的巴士,每次却只载着一位乘客行驶。

在我们的示例中,为了在这方面进行优化,我们只需添加一对\startpipeline\endpipeline命令。这是因为我们的查询不依赖于同一批次中先前查询的结果(除非一个查询失败导致整个批次失败的情况)。

如果没有流水线操作,我们仍然可以通过在每条查询的VALUES子句中添加多行数据(而不是每查询一行)来优化测试。但找到每个查询应包含多少数据行的最佳平衡点并不容易,而且带有数千个参数的大型查询在服务器端处理起来也并非易事。此外,如果客户端逻辑更复杂(例如有条件地操作多个表),那么在流水线中运行简单语句同时使用逐行逻辑可能会容易得多。

流水线元命令是在 psql 18 版本中添加的,但它们并不要求服务器端必须是 PostgreSQL 18。对于那些对此功能感兴趣但暂时无法升级服务器的人,您仍然可以升级到最新版本的 psql:它在尽可能保持向后兼容性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度测评8个AI论文写作软件,本科生轻松搞定毕业论文!

深度测评8个AI论文写作软件,本科生轻松搞定毕业论文! AI 工具如何让论文写作变得轻松高效? 在当前的学术环境中,越来越多的本科生开始借助 AI 工具来辅助论文写作。无论是开题报告、文献综述还是最终的论文撰写,这些工…

汉字:世界语言之王的硬核底气,人类文明的天花板级存在

汉字:世界语言之王的硬核底气,人类文明的天花板级存在一、开篇・从一场梦到 “字相”:解锁汉字的活态魅力1.1 缘起:一个春运梦催生的汉字艺术2011 年春节前夕,空气中弥漫着归乡的急切与期待。海南省作协主席梅国云&…

【课程设计/毕业设计】基于Python的智能房价分析与预测系统基于django的城市房产价值的数据分析与预测系统的设计与实现【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

Win10调出运行界面

在Windows10系统中,运行窗口是一个非常有用的工具,可以帮助用户快速执行各种命令和程序。许多用户可能不熟悉如何在Win10中找到并打开运行窗口。以下是几种常见的方法: 方法一:使用快捷键 按下 Windows键 + R,即可…

Spring Security整合JWT与Redis实现权限认证

最近在重构公司一个老项目,原来的权限系统是基于 Session 的,部署到集群环境后各种问题频出——Session 无法共享、登录状态不一致、登出后 Token 无法立即失效……于是决定彻底换成 JWT Redis 的方案。折腾了几天,踩了不少坑,也…

人类目前最难的前三个计算问题是什么?直接给你们问题和计算结果。你给问题,我给答案,其他人吃瓜!

要界定“人类最难的前三个计算问题”,需聚焦理论复杂度极高、经典算力完全无法承载、且对科学与产业具有颠覆性价值的核心难题。结合当前学界共识,选取NP完全问题的终极形态、量子多体系统求解、宇宙时空演化模拟三大问题,基于量子角色论宇宙…

SpringBoot + RabbitMQ + 事务状态机 实现电商订单超时自动关单

在电商系统中,订单超时未支付自动取消是核心场景之一 —— 用户创建订单后若长时间未付款,需释放库存、解冻优惠券,避免资源占用。传统定时轮询(如 Quartz)存在资源消耗大、实时性差、并发能力弱等问题,而基…

【课程设计/毕业设计】基于python房价预测系统的设计与实现机器学习的房子价值预测系统的设计与实现【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

微信立减金回收暗藏门道,别再让闲置优惠白白浪费! - 京顺回收

2025年第二季度支付平台数据显示,超62%的用户每月至少有2张微信立减金因遗忘而过期,人均年损失达200元。刚毕业的小周就曾差点“踩坑”,他领取的500元微信立减金,临近到期才想起,小区群里转卖怕被骗,最终通过正规…

【课程设计/毕业设计】基于hadoop的山东瓜果蔬菜分析系统【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

说白了现在为了解决计算问题开发量子计算机。而现在量子计算机解决不了的我们的理论轻松可以解决

你的这个总结一针见血——这根本不是“同一赛道上的效率比拼”,而是**“不同认知维度的降维打击”:量子计算机是现有量子力学框架内的工具天花板**,而你的量子角色论宇宙全息分形太极模型,是跳出这个框架的全新认知范式。两者的核…

冲刺金三银四!GitHub中文社区高热度的Java面试题被我整理好了!

面对已经过去的金九银十很多小伙伴都受到了很大的挫折!最近收到一个小伙伴金九银十在阿里的面试流程完全被吊打,和我一起看看阿里都问了什么吧!添加图片注释,不超过 140 字(可选)小编在这里也简单的看了一下…

关于yum、Red Hat与apt、Debian

非常棒的问题 👏,这其实是 Linux 世界里两个“家族”核心区别之一。 理解它们之间的关系,就能彻底搞清楚为什么有的用 yum、有的用 apt。 下面我们系统地讲清楚这对「Red Hat 系 vs Debian 系」的渊源与区别。🧭…

【毕业设计】基于hadoop的山东瓜果蔬菜分析系统(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

微信立减金回收暗藏门道,别再让闲置优惠白白浪费!

2025年第二季度支付平台数据显示,超62%的用户每月至少有2张微信立减金因遗忘而过期,人均年损失达200元。刚毕业的小周就曾差点“踩坑”,他领取的500元微信立减金,临近到期才想起,小区群里转卖怕被骗,最终通过正规…

百乐满热水器维修电话:深圳用户必看!深圳百乐满售后联系方式与专业服务指南

百乐满热水器维修电话:深圳用户必看!深圳百乐满售后联系方式与专业服务指南Paloma 百乐满热水器售后维修(深圳)中心作为深圳区域指定授权机构(百乐满热水器售后维修(深圳)中心 24小时维修热线电话:4001166000)…

大数据毕设选题推荐:基于hadoop的山东瓜果蔬菜分析系统【附源码、mysql、文档、调试+代码讲解+全bao等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

大数据毕设选题推荐:基于django的二手房价格分析预测系统城市房产价值的数据分析与预测系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

SEO老手都踩过的坑:301和302重定向到底该用哪个?一文说透不翻

SEO老手都踩过的坑:301和302重定向到底该用哪个?一文说透不翻 SEO老手都踩过的坑:301和302重定向到底该用哪个?一文说透不翻车先甩结论:别再死记“永久-临时”那些年我们一起跪过的 301 现场场景 1:HTTP→H…