了解 PostgreSQL 的扩展查询协议

news/2024/4/27 11:30:29/文章来源:https://blog.csdn.net/qq_35423190/article/details/129138740

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.

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

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

相关文章

【C++的OpenCV】第二课-CMake创建OpenCV项目

文章目录一、CMake是什么?1.1 基本概念1.2 CMake的优势二、使用Cmake构建一个OpenCV程序2.1 步骤(a)编写一个简单的OpenCV示例代码(b)创建一个Cmake文件(c)生成可执行文件(d&#xf…

DAX 微信 markdown 编辑器

DAX 微信 markdown 编辑器 一、致谢 感谢开源项目: md wechat-format 感谢 WordPress 插件 Mine云点播 作者 mine27 的指导。 二、如何使用 打开如下地址,直接编辑,可以实时看到符合微信公众号排版的效果。 推荐访问:https://j…

线上问题诊断指南

内容概要 诊断工具介绍工具可用情况偶现或已现问题诊断思路 硬件资源观测 top top可以看整个系统cpu、内存的使用情况,以及在各个进程上的情况,如下: $ top top - 13:14:07 up 2 days, 6:38, 0 users, load average: 1.65, 0.59, 0.27…

只因小黑子:SVG

小黑子的SVG复习SFV画布1. 初始SVG2. SVG绘制矩形、圆形和椭圆形2.1 rect 矩形2.2 circle 圆形2.3 ellipse 椭圆4. SVG绘制线条、多边形和多线条4.1 line 线条4.2 polygon 多边形4.3 polyline 多线条5. SVG绘制文本 text6. SVG绘制路径 path7. SVG描边属性8. SVG 模糊和阴影效果…

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

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

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层, 监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。 TNS是Oracle Net…

Centos7搭建hadoop3.3.4分布式集群

文章目录1、背景2、集群规划2.1 hdfs集群规划2.2 yarn集群规划3、集群搭建步骤3.1 安装JDK3.2 修改主机名和host映射3.3 配置时间同步3.4 关闭防火墙3.5 配置ssh免密登录3.5.1 新建hadoop部署用户3.5.2 配置hadoopdeploy用户到任意一台机器都免密登录3.7 配置hadoop3.7.1 创建目…

linux shell脚本详解

一、!/bin/bash --- 指定脚本解释器 二、注释 1、单行注释 以 # 开头的行就是注释 2、多行注释 一般使用第一种!来注释 三、变量 只读变量 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 删除变量 unset variable_name…

社招中级前端笔试面试题总结

HTTP世界全览 互联网上绝大部分资源都使用 HTTP 协议传输;浏览器是 HTTP 协议里的请求方,即 User Agent;服务器是 HTTP 协议里的应答方,常用的有 Apache 和 Nginx;CDN 位于浏览器和服务器之间,主要起到缓存…

前端页面jquery规范写法

使用最新版本的 jQuery 最新版本的 jQuery 会改进性能和增加新功能,若不是为了兼容旧浏览器,建议使用最新版本的 jQuery。以下是三条常见的 jQuery 语句,版本越新,性能越好: $(.elem) $(.elem, context) context.find(.elem) 结果 1.6.2 版执行次数远超两个老版本。 jQ…

一文解决Rust字符串:String,str,String,str,CString,CStr

一、str和&str和String的区别 1.存放位置,可变不可变: str来源于Rust本身的数据类型,而String类型来自于标准库。首先看一下str 和 String之间的区别:String是一个可变的、堆上分配的UTF-8的字节缓冲区。而str是一个不可变的…

ElementUI分页的实现

官网地址&#xff1a;Element - The worlds most popular Vue UI framework 第一步&#xff1a;拷贝你喜欢的分页类型放在你的组件页面需要用到的分页位置 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-p…

记一次:request请求总结

前言&#xff1a;和前端联调的时候发现前端人员请求的方式不对&#xff0c;固做此总结问题&#xff1a;request请求方式有多少种&#xff1f;答&#xff1a;Java后端查看有8种&#xff0c;spring-web中的java枚举图如下而使用PostMan查看有15种&#xff0c;如下图GET&#xff0…

【重点掌握】Java基础之Javaweb核心技术详解

都说一入Java深似海&#xff0c;从此代码是爱人&#xff0c;但是学习的过程却从来都不轻松。当下&#xff0c;越来越多的互联网企业&#xff0c;招聘Java工程师时&#xff0c;明确写道需熟练掌握JavaWeb技术。作为衔接前后端的重要一环&#xff0c;JavaWeb技术已成为程序员向大…

火热报名 | DockQuery 1.2 beta版本体验官开启招募!

DockQuery是什么&#xff1f; DockQuery 代号「天狼」&#xff0c;是图尔兹全新自研的一款专业新型数据库桌面客户端&#xff0c;专为信创背景下国内外数据库开发/管理而设计&#xff0c;全面覆盖信创数据库目录、支持国内外操作系统。 目前&#xff0c;DockQuery 仅以社区版…

【教程】GitBook Editor编写电子书

GitBook Editor电子书编写说明1、安装软件2、创建文档3、编辑文档4、生成电子书1、安装软件 下载并安装GitBook Editor软件&#xff0c;网上资源很多&#xff0c;根据自己系统选用即可 官网参考&#xff1a;GitBook - Where technical teams document. 2、创建文档 1&#xf…

Talk | 清华大学交叉信息研究院助理教授杜韬:利用计算方法探究流固耦合

本期为TechBeat人工智能社区第474期线上Talk&#xff01; 北京时间2月15日(周三)20:00&#xff0c;清华大学交叉信息研究院助理教授——杜韬的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “利用计算方法探究流固耦合”&#xff0c;届时将介绍流固…

HTTP与HTTPS原理

目录 HTTP 协议背景 协议格式 请求行 请求报头 请求正文&#xff08;有效载荷&#xff09; 响应行 HTTPS原理 协议背景 什么是加密&#xff1f; 为什么要加密&#xff1f; 加密方式 数据摘要&#xff08;数据指纹&#xff09; 协议加密方案实现探究 方案一&#xff1a;只使用对…

【云原生】初识Kubernetes的理论基础

一、kubernetes概述 1.1 kubernetes介绍 K8S的全称为Kubernetes (K12345678S)&#xff0c;首字母与尾字母中间有8个字母&#xff0c;缩写为K8S 作用 用于自动部署、扩展和管理“容器化(containerized) 应用程序”的开源系统。可以理解成K8S是负责自动化运维管理多个容器化程序…

【云原生】k8s之Yaml文件详解

一、K8S支持的文件格式 kubernetes支持YAML和JSON文件格式管理资源对象。 JSON格式&#xff1a;主要用于api接口之间消息的传递YAML格式&#xff1a;用于配置和管理&#xff0c;YAML是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 1、yaml和json的主…