PG的管道模式如何工作

简介: PG的管道模式如何工作

PG的管道模式如何工作


今天给大家介绍PG引入的一个很酷的特性--管道模式。

什么是管道模式呢?管道模式允许应用程序发送查询,而不用读取先前发送查询的结果。一句话,它允许在单个网络事务中发送和接收多个查询和结果,从而显著提高性能。

正如所有好主意一样,都有一个范例:人们可以使用应用程序代码来模拟这种行为。在客户端与服务之间异步通信了一段时间,或者称之为“批处理模式”。有许多现有的解决方案以异步方式处理多个查询。例如PgJDBC多年来一直使用标准JDBC批处理接口支持批处理模式。当然,还有老的可靠备用dblink

流水线模式的不同之处在于它提供了一个开箱即用的解决方案,大大降低了应用程序代码处理客户端--服务端会话的复杂性。


传统的批处理模式

 

流水线模式

 

尽管在PG14中引入,管道模式适用于当前任何版本。因为增强在客户端使用的LIBPQ中,而不是服务端本身。

现在是坏消息了:利用流水线模式和需要使用C”或能够之间与LIBPQ交互的编程语言。不幸的是,目前还没有太多的ODBC开发方式提供必要的钩子来利用这个增强的特性。因此,需要使用上述编程语言来涉及和编程客户端--应用程序会话。

提示:对于某些人来说,这是一个为自己命名并创建一个方便的LIBPQ管道模式接口的号方法。


怎么运行


现在来探讨下这个机制是如何工作的。

保持简单:

1)客户端首先连接到PG服务

2)客户端连接必须切换到管道模式

3)一旦进入管道模式,SQL语句就会被发送到服务

4)达到服务后,语句立即执行并将结果发送回客户端,即不需要客户端/服务端确认

5)因为每个SQL语句都是按顺序发送,所以应用程序逻辑可以使用状态机或者利用FIFO队列来处理结果

6)一旦所有异步语句都已执行并返回,客户端应用程序显式终止管道模式并将连接返回到默认设置

由于每个SQL语句本质上都是幂等性的,因此由客户端逻辑来解释结果。发送SQL语句并提取彼此无关的结果是一回事,但当处理具有某种程度上互相依赖的逻辑结果时,会变得更加复杂。

可以将异步SQL语句捆绑为单个事务。但与所有事务一样,这些异步发送的SQL语句中任何一个失败都将导致所有SQL语句回滚。

当然API确实在管道故障情况下提供错误处理。在FATAL情况下,当管道本身失败时,客户端连接会接收到错误通知,从而将剩余的排队操作标记为丢失。此后恢复正常处理,就好像管道已被客户端明确关闭,并且客户端连接保持活动状态。


细节


对于C程序员来说,这里有一些参考资料:

1)如前所述,可以针对多个版本的PG使用此功能,但尽在PG14及以后版本进行了描述

2)PG14源代码:src/test/modules/libpq_pipeline/libpq_pipeline.c提供了一个执行SELECT函数调用的简单例子


注意


1) 流水线模式专为异步模式而涉及,因此同步模式不可使用,这有点违背了流水线模式的目的。

2) 一次只能发送一个SQL命令,不允许多个SQL

3) 不允许复制

4) 在发送事务COMMIT情况下:客户端在收到相应结果前,不能假定事务已提交

5) 利用流水线模式需要使用C或者可以访问libpsq api的语言进行编程


参考


https://stackoverflow.com/questions/65469533/where-is-query-pipelining-in-libpq

https://www.postgresql.org/message-id/flat/CAMsr+YFUjJytRyV4J-16bEoiZyH=4nj+sQ7JP9ajwz=B4dMMZw@mail.gmail.com


原文


https://www.percona.com/blog/how-postgresql-pipeline-mode-works/

目录
相关文章
|
2月前
|
调度
系统库调用如何在内核模式和用户模式之间切换?
【10月更文挑战第29天】系统库调用通过特定的指令触发从用户模式到内核模式的切换,传递参数并保存上下文,在内核模式下完成系统服务的处理后,再恢复上下文并返回用户模式。这种模式切换机制是操作系统实现用户程序与内核交互的核心机制,保证了系统的稳定性、安全性和资源的有效管理。同时,异常和中断处理也会涉及到类似的模式切换,共同构成了操作系统复杂而高效的运行机制。
47 4
|
5月前
|
存储 SQL 运维
DM8数据守护集群入门介绍
DM8数据守护集群入门介绍
48 0
|
SQL 关系型数据库 MySQL
系统设计与数据库系统 作业一 Basic SQL command LAB(下)
系统设计与数据库系统 作业一 Basic SQL command LAB(下)
137 0
系统设计与数据库系统 作业一 Basic SQL command LAB(下)
系统设计与数据库系统 作业一 Basic SQL command LAB(上)
系统设计与数据库系统 作业一 Basic SQL command LAB(上)
86 0
系统设计与数据库系统 作业一 Basic SQL command LAB(上)
|
存储 SQL 安全
2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数|学习笔记
快速学习2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数
2 PostgreSQL 物理,逻辑,进程结构以及系统表系统函数|学习笔记
|
开发工具 Perl
ZYNQ-实现PL和PS端的协调设计
ZYNQ-实现PL和PS端的协调设计
395 0
ZYNQ-实现PL和PS端的协调设计
|
SQL 安全 Java
SQLite切换日志模式优化
SQLite是一款轻型的数据库,SQLite 是一款轻量级数据库,是一个 关系型数据库管理系统,它包含在一个相对小的 C 库中,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它能够支持 Windows/Linux/Unix/Android/iOS 等等主流的操作系统,占用资源非常的低,因此在移动端也SQLIte有多种日志模式(具体见背景知识),在项目的开发迭代中,会遇见原本就版本app使用的SQLite日志模式是旧版默认的rpllback journal,当用户设备存在待恢复的.journal文件,新版本app的SQLite又需要将日志模式切换至wal时有很广泛的应用。
612 0
|
Oracle 关系型数据库 Shell
greenplum 4.1 版本及老版本如何使用读写外部表+管道实现gptransfer同步功能
greenplum 4.1 版本及老版本如何使用读写外部表+管道实现gptransfer同步功能
945 0
|
SQL 数据库
PCB SQL SERVER 数据库阻塞进程关系以思维导图方式呈现的实现方法
PCB SQL SERVER 数据库阻塞进程关系以思维导图方式呈现的实现方法 最近公司数据库同步机制常发生阻塞,时不时的导致PCB工程系统卡死现象,只有找到阻塞源头并处理掉,才以消除阻塞,但数据库中查看会话阻塞是通过二维表方式展示的父子会话进程ID的,是很难清楚的展示各会话进程ID的关系图的。
835 0
|
SQL 关系型数据库 数据库