当前位置: 首页 > news >正文

了解 PostgreSQL 的扩展查询协议

1.介绍

本篇博客用于解释扩展协议的工作原理以及它与简单查询的区别。

2.简单查询

在PostgreSQL中,客户端连接能够发起两种类型的查询:简单查询扩展协议查询

简单查询顾名思义。

当启动 psql 客户端连接到pg服务器时,几乎所有发送的sql命令会被视为简单查询。

包括使用 begin 和 commit 包起来的显式事务;使用分号分割的多语句查询;执行或定义函数等等。

简单查询自动遵循标准查询处理流程,其中包括以下阶段:

  • Parser
  • Analyzer
  • Rewriter
  • Planner
  • Executor

这些具体含义这里不再赘述。网上的资料很多。

客户端和服务器之间的通信也非常简单。

case 1, insert

客户端将查询发送到服务器进行处理,服务器响应一个 CommandComplete 消息(比如 INSERT 0 1,接一个ReadyForQuery(IDLE)消息),表示现在服务器已经完成了查询,目前是闲置状态,客户端可以发送另一个查询,新的查询遵循同样的逻辑。

case 2, select

在 SELECT 查询的情况下,服务器将先发送结果 row 的行结构描述,然后发送满足查询的实际行数据,直到没有更多行可返回为止。

最后,服务器发送一个 ReadyForQuery(IDLE) 消息,表明服务器已经完成查询,现在处于空闲状态。

3.扩展协议查询

扩展查询是客户端完成查询的另一种方式,它将标准查询处理分解为不同的步骤 。客户端需要确保正确执行这些步骤。

客户端能够发送以下协议消息类型来控制:

‘P’ message (Parse)

  • 采用通用查询字符串,其中数据值替换为 $1、$2 等占位符,稍后可以在 'B’ 步骤中替换为实际值。
  • 该字符串会经历以下阶段:Parser -> Analyzer -> Rewriter
  • 在 Parse 阶段成功后,会创建一个 prepared statement ,类别于sql中的PREPARE
  • prepared statement 可以是 命名 或者 未命名 的(下面详细介绍)
  • prepared statement 只是输入查询的一种表示,还不能执行。

‘B’ message (Bind)

  • 'B' 阶段将会把 ‘P’ 阶段创建的prepared statement,替换掉 $1、$2 等占位符,改为用户提供的值。
  • 将值替换掉后,将会获得一个完整的查询语句,之后会由Planner生成执行计划。
  • 构建执行计划成功后,会生成一个portal。
  • portal也可以是命名或者未命名的。
  • portal基本上是一个对象,表示如何执行特定查询。

‘E’ message (Execute)

  • ‘E’ 阶段会真正执行 ‘B’ 阶段生成的portal对象。
  • 生成结果行(如果有),然后发送给客户端。

‘S’ message (Sync)

  • 在一条语句最后,客户端必须向服务器发送 S 消息以指示扩展查询的结束。
  • 此消息会让服务器结束当前事务,并将 ReadyForQuery(IDLE) 消息发送回客户端。

将一个简单的查询分成多个步骤的目的是什么?

使用扩展查询的一大好处是它可以节省大量不必要的相同查询结构的解析。

相反,我们可以只解析一次公共结构,然后多次绑定和执行不同的值。

4. 命名和未命名的prepared statement、portal

这一节用来讨论命名和未命名的prepared statement、portal有什么意义。

一般情况下,PostgreSQL 服务器只能保留一个未命名的prepared statement或者portal。

新的未命名的prepared statement或者portal将替换现有的。

而使用命名的prepared statement或者portal,服务端将会进行存储,客户端可随时调用或者发送Close message.进行销毁。

因此,客户端可以在一个事务中创建多个prepared statement,每个都有不同的名字,然后通过给它们不同的portal名称同时为它们绑定值。最终,客户端选择要执行的portal

More importantly, named prepared statement’s life time lasts for the entire TCP session unless explicitly destroyed; named portal lasts only until the end of transaction or when it is executed or explicitly destroyed.

 以libpq为例,当使用扩展查询时,需要客户端应用提供prepared statement name来构造P(Parse)消息,而不需要客户端应用提供portal name来构造B(Bind)消息。

这意味着使用 libpq,我们可以使用不同的prepared statement名;但是对于 B 消息,它强制使用unnamed portal,所以我们总是有一个portal执行,这避免了在客户端管理多个portal名称的情况。

翻译自:

A Look Inside PostgreSQL's Extended Query Protocol - Highgo Software Inc.

相关文章:

了解 PostgreSQL 的扩展查询协议

1.介绍 本篇博客用于解释扩展协议的工作原理以及它与简单查询的区别。 2.简单查询 在PostgreSQL中,客户端连接能够发起两种类型的查询:简单查询和扩展协议查询。 简单查询顾名思义。 当启动 psql 客户端连接到pg服务器时,几乎所有发送的…...

接入网关和隔离网关

文章目录1. 什么是网关?2. 网关的作用是什么?3. 接入网关和隔离网关1. 什么是网关? 网关(Gateway)是一种网络设备,通常用于将不同网络之间的流量进行转发和路由,将一个网络连接到另一个网络&…...

实用指南:如何在Anolis OS上轻松使用 Kata 安全容器?

文/云原生SIG本篇文章我们将详细介绍怎么轻松在 Anolis OS 上使用 Kata Containers 安全容器,我们将介绍 Kata Container 社区于 2022 年 10 月 10 日最新发行的 Kata3.0.0 的安装部署方式,3.0.0 版本包含了基于袋鼠 RunD 开源的最新 Rust Kata runtime …...

如何锁定Word文档部分文字不被修改

我们知道,想要保护Word文档的内容无法随意更改,可以设置“限制编辑”的保护模式。 那如果实际工作中,只需要固定的一部分内容不能编辑,可以实现吗?答案是肯定的,今天就来说说如何设置Word文档部分文字可修…...

聊聊8万8的私董会,很扎心

聊聊8万8的私董会,很扎心 道几句真心话,很扎心,但也很现实。 如果你喜欢刷抖音,这种感觉应该会更加明显。 股市哀鸿遍野,实体一地鸡毛,我们办公室楼下的门面换了一波又一波。 别说那些不起眼的小生意&a…...

卷积网络与全连接网络的区别

问题卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络。全连接神经网络是具有多层感知器的的网络&a…...

【5000左右电脑配置清单】预算不高于5000,不带显示器的电脑配置清单推荐

由于本人是学生党经济有限&#xff0c;预算不高于5000元配一套电脑主机&#xff0c;说实话5000左右的电脑配置已经很好了&#xff0c;今天站长整理了几款配置给大家参考参考&#xff0c;更多电脑配置还请继续关注西安SEO优化站点&#xff01; 配置1&#xff1a; <CPU> I5…...

在 4G 内存的机器上,申请 8G 内存会怎么样?

在 4GB 物理内存的机器上&#xff0c;申请 8G 内存会怎么样&#xff1f; 这个问题在没有前置条件下&#xff0c;就说出答案就是耍流氓。这个问题要考虑三个前置条件&#xff1a; 操作系统是 32 位的&#xff0c;还是 64 位的&#xff1f;申请完 8G 内存后会不会被使用&#x…...

JavaSE学习day9 集合(基础班结束)

1.ArrayList 集合和数组的优势对比&#xff1a; 长度可变 添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 不能存基本数据类型。只能通过包装。 1.1ArrayList类概述 什么是集合 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 Ar…...

Python爬虫进阶 - win和linux下selenium使用代理

目录 Windows selenium配置 下载地址 Chrome Chromedriver 版本对应关系 实践测试 操作元素 浏览器操作 获取元素信息 鼠标操作 实战demo selenium添加代理 Linux selenium配置 检查服务器环境 下载安装第三方库&#xff08;最简单版&#xff09; 实践测试 代码…...

力扣-从不订购的客户

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;183. 从不订购的客户二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果总结前言…...

速来!掘金数据时代2022年度隐私计算评选活动火热报名中!

开放隐私计算 开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号…...

Springboot @Test 给Controller接口 写 单元测试

前言 最近有小伙伴问到怎么给 controller的接口写单元测试。 单元测试是开发必不可少的一个环节。 既然有人问到了&#xff0c;那我觉得可能不止一个人不会&#xff0c;那就按照惯例&#xff0c;出手。 正文 内容&#xff1a; 主要是get 和 post 两种请求方式的接口 的 单元测…...

ISO 6721-1~12 ,塑料-电动机械性能的测定,2022更新

ISO 6721-1 :2019 Plastics - Determination of dynamic mechanical properties - Part 1: General principles ISO 6721-1 :2019 塑料 - 电动机械性能的测定. 第1部分:一般原理 ISO 6721-2 :2019 Plastics — Determination of dynamic mechanical properties — Part 2:…...

vue3.2中使用swiper缩略图轮播教程

介绍 在vue3 中使用 swiper 实现缩略图的轮播图效果,具体如下图所示: 使用 切换到项目终端 ,输入命令 npm install swiper --save , 进行安装在 main.js里,引入 swiper.css并使用,具体代码如下;import {createApp } from vue import App from ./App.vue import router…...

边玩边学,13个 Python 小游戏真有趣啊(含源码)

经常听到有朋友说&#xff0c;学习编程是一件非常枯燥无味的事情。其实&#xff0c;大家有没有认真想过&#xff0c;可能是我们的学习方法不对&#xff1f; 比方说&#xff0c;你有没有想过&#xff0c;可以通过打游戏来学编程&#xff1f; 今天我想跟大家分享几个Python小游…...

MySQL数据文件迁移(不关闭SELinux)

背景 日常实施中可能会出现在部署MySQL时未更改数据默认存储路径&#xff08;默认&#xff1a;/var/lib/mysql&#xff09;&#xff0c;然而一般分配服务器的人只会给系统分区分配50G的空间&#xff0c;这导致后续空间不够用的情况&#xff0c;也就出现了需要迁移数据的问题。…...

uboot / linux添加/去除 版本号LOCALVERSION

背景 偶然的机会&#xff0c;在insmod驱动模块的时候&#xff0c;遇到报错&#xff1a; 查找原因&#xff0c;说是当前系统内核版本和模块编译使用版本不同&#xff01; 使用如下命令查看当前系统内核版本&#xff1a; uname -r 使用modinfo命令&#xff08;嵌入式设备没有此…...

2023北京养老展,北京养老展会,北京养老产业展览会

CBIAIE第十届中国&#xff08;北京&#xff09;国际老年产业博览会&#xff0c;8月28-30日在北京亦创国际会展中心举办&#xff1b; 预期效果&#xff1a;中国&#xff08;北京&#xff09;国际老年产业博览会China (Beijing) International Aged industry Expo&#xff08;CB…...

华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 分糖果 小明从糖果…...

C++ map基础概念、map对象创建、map赋值操作、map大小操作、map数据插入、map数据删除、map数据修改、map数据统计

map的使用频率很高&#xff0c;仅次于vector&#xff0c;先了解下pair的概念&#xff1a; pair 概念&#xff1a; template<class _Ty1, class Ty2> struct pair{ _Ty1 first; // 这两个可以是任意的类型 _Ty2 second; }; eg&#xff1a;pair<int, int> p(13,…...

深入浅出Spring Security

一、Spring Security基本组件 Spring Security的设计理念是提供一种可插拔的、高度可定制的安全服务。其核心功能依赖于以下几个关键组件&#xff1a; Authentication (认证): 概念: 确认用户身份的过程&#xff0c;即验证“你是谁”。核心类: Authentication 接口&#xff0c…...

一.设计模式的基本概念

一.核心概念 对软件设计中重复出现问题的成熟解决方案&#xff0c;提供代码可重用性、可维护性和扩展性保障。核心原则包括: 1.1. 单一职责原则‌ ‌定义‌&#xff1a;一个类只承担一个职责&#xff0c;避免因职责过多导致的代码耦合。 1.2. 开闭原则‌ ‌定义‌&#xf…...

分库分表的取舍

文章目录 大数据量下采用**水平分表**的缺点**1. 跨表查询复杂性与性能下降****2. 数据分布不均衡****3. 分布式事务与一致性问题****4. 扩展性受限****5. 查询条件限制与索引管理复杂****6. 数据迁移与维护成本高****7. 业务逻辑复杂度增加****总结** shardingJdbc分片策略**1…...

学习记录:DAY32

Electron 开发之旅&#xff1a;从入门到实践 前言 接续上一篇 blog&#xff0c;这篇的内容主要和 Electron 有关。 课设不是特别想做下去了&#xff0c;实际核心代码大概只有 3&#xff0c;4 百行左右&#xff0c;比较水…… 或许会把 Docker 的部署也做一做&#xff08;权当是…...

机器翻译模型笔记

机器翻译学习笔记&#xff08;简体中文&#xff09; 1. 任务概述 目标&#xff1a;将英文句子翻译成简体中文。 示例&#xff1a; 输入&#xff1a;Tom is a student. 输出&#xff1a;汤姆是一个学生。 框架&#xff1a;Seq2Seq&#xff08;序列到序列&#xff09;模型。…...

提取数据区域中表格

查看本示例演示效果本示例关键代码的编写位置&#xff0c;请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码 在实际的开发过程中&#xff0c;有时会遇到希望提取Word文档中表格数据保存到服务器的需求&#xff0c;此时可以使用PageOffice提取Word文档数据区域…...

应用分享 | 精准生成和时序控制!AWG在确定性三量子比特纠缠光子源中的应用

在量子技术飞速发展的今天&#xff0c;实现高效稳定的量子态操控是推动量子计算、量子通信等领域迈向实用化的关键。任意波形发生器&#xff08;AWG&#xff09;作为精准信号控制的核心设备&#xff0c;在量子实验中发挥着不可或缺的作用。丹麦哥本哈根大学的研究团队基于单个量…...

对抗反爬机制的分布式爬虫自适应策略:基于强化学习的攻防博弈建模

在大数据时代&#xff0c;数据的价值不言而喻。网络爬虫作为获取数据的重要工具&#xff0c;被广泛应用于各个领域。然而&#xff0c;随着爬虫技术的普及&#xff0c;网站为了保护自身数据安全和服务器性能&#xff0c;纷纷采取了各种反爬机制。这就使得爬虫与反爬虫之间形成了…...

行为设计模式之Command (命令)

行为设计模式之Command &#xff08;命令&#xff09; 前言&#xff1a; 需要发出请求的对象&#xff08;调用者&#xff09;和接收并执行请求的对象&#xff08;执行者&#xff09;之间没有直接依赖关系时。比如遥控器 每个按钮绑定一个command对象&#xff0c;这个Command对…...