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

Postgres SELECT INSERT 流程 ?

SELECT

当执行SELECT查询时,PostgreSQL数据库会按照以下流程进行处理:

  1. 首先,查询语句会被发送到服务器。

  2. 服务器会接收查询请求,并根据查询条件从表中读取数据。

  3. 数据库会将数据存储在磁盘上的数据文件中,然后将其读取到内存中进行处理。

  4. 数据库会对数据进行排序、过滤、聚合等操作。

  5. 查询结果会被发送回客户端。

  6. 客户端会接收到查询结果,并将其显示在屏幕上。

在查询执行过程中,PostgreSQL数据库会使用多种技术来提高查询性能,例如使用索引、分区表、并行查询等。同时,PostgreSQL还支持多种查询语句,例如JOIN、GROUP BY、HAVING等,可以帮助用户更加灵活地查询数据。

缓存

当PostgreSQL执行SELECT查询时,会涉及到三个重要的缓存:Shared Buffers、OS Cache和Disk Cache。下面分别介绍这三个缓存的作用:

  1. Shared Buffers:这是PostgreSQL自己实现的内存缓存,用于缓存最常用的数据块。当查询需要读取数据时,PostgreSQL首先会从Shared Buffers中查找数据,如果没有找到,则需要从磁盘上的数据文件中读取数据。

  2. OS Cache:这是操作系统提供的内存缓存,用于缓存已经读取过的数据块。当PostgreSQL需要读取数据时,如果数据已经被缓存在OS Cache中,则可以直接从OS Cache中读取数据,而不需要从磁盘上的数据文件中读取。

  3. Disk Cache:这是磁盘本身提供的缓存,用于缓存磁盘上的数据块。当数据被写入磁盘时,数据会先被写入Disk Cache中,然后再由操作系统将数据写入磁盘。当需要读取数据时,如果数据已经被缓存在Disk Cache中,则可以直接从Disk Cache中读取数据,而不需要从磁盘上的数据文件中读取。

在查询执行过程中,PostgreSQL会根据需要将数据缓存在这三个缓存中,以提高查询性能。同时,当数据被修改时,PostgreSQL会将修改的数据缓存在Shared Buffers中,然后定期将缓存中的脏数据刷回磁盘。具体的刷脏流程如下:

  1. 当数据被修改时,数据会被标记为脏数据。

  2. 当Shared Buffers中的脏数据达到一定程度时,PostgreSQL会将脏数据写入磁盘,并将数据标记为干净数据。

  3. 如果磁盘上的数据文件已经被写满,则需要将部分干净数据写入磁盘,以腾出空间。

  4. 当数据被写入磁盘后,PostgreSQL会将数据从Shared Buffers中移除。

  5. 当需要读取数据时,PostgreSQL会首先从Shared Buffers中查找数据,如果没有找到,则需要从磁盘上的数据文件中读取。如果数据已经被缓存在OS Cache或Disk Cache中,则可以直接从OS Cache或Disk Cache中读取数据,而不需要从磁盘上的数据文件中读取。

综上所述,PostgreSQL的查询执行过程涉及到多个缓存和刷脏机制,这些机制可以提高查询性能,并保证数据的一致性和持久性。

INSERT

当执行 INSERT 操作时,PostgreSQL 会将新数据插入到对应的表中。这个过程可以被分为以下几个步骤:

  1. 检查是否有足够的权限:在执行 INSERT 操作之前,PostgreSQL 会检查当前用户是否有足够的权限来执行该操作。如果用户没有足够的权限,则操作将被拒绝。

  2. 检查约束条件:在执行 INSERT 操作之前,PostgreSQL 会检查表的约束条件是否被满足。如果约束条件不被满足,则操作将被拒绝。

  3. 分配事务 ID:在执行 INSERT 操作之前,PostgreSQL 会为该操作分配一个唯一的事务 ID。这个事务 ID 在事务提交或回滚时被使用。

  4. 写入 WAL 日志:在执行 INSERT 操作之后,PostgreSQL 会将该操作写入 WAL(Write-Ahead Logging)日志。这个日志记录了数据库的所有修改操作,以便在数据库崩溃时可以恢复数据。

  5. 刷脏缓存:在执行 INSERT 操作之后,PostgreSQL 会将新数据写入到共享缓存中。如果该数据已经存在于缓存中,则该数据将被更新。在这个过程中,PostgreSQL 会标记缓存中的数据为“脏数据”,表示该数据已经被修改但还没有被写入到磁盘中。

  6. 刷脏数据到磁盘:在执行 INSERT 操作之后,PostgreSQL 会将脏数据写入到磁盘中。这个过程被称为“刷脏”。在这个过程中,PostgreSQL 会使用 WAL 日志来确保数据的一致性和可恢复性。

  7. 更新索引:在执行 INSERT 操作之后,PostgreSQL 会更新表的索引。这个过程可以被分为两个步骤:首先,PostgreSQL 会将新数据插入到索引中;其次,PostgreSQL 会更新已有数据的索引。

在执行 INSERT 操作时,PostgreSQL 还会使用 redo 和 undo 日志来确保数据的一致性和可恢复性。redo 日志记录了所有修改操作,而 undo 日志记录了回滚操作。当数据库发生崩溃时,PostgreSQL 可以使用 redo 和 undo 日志来恢复数据。

PostgreSQL 数据库中有 Redo 和 Undo 的概念。

Redo 是指在数据库崩溃或者重新启动之后,将已经写入到磁盘上的数据重新加载到内存中,确保数据的一致性。在 PostgreSQL 中,Redo 信息被存储在 WAL 日志文件中。WAL 日志文件记录了数据库中所有的变更操作,可以被用来恢复数据库。

Undo 是指在事务回滚时,将已经修改的数据恢复到之前的状态。在 PostgreSQL 中,Undo 信息被存储在 Undo 日志文件中。Undo 日志文件记录了事务执行前的数据状态,可以被用来回滚事务。

需要注意的是,PostgreSQL 中的 Undo 日志文件是在实验阶段的功能,目前还不太成熟。如果需要使用 Undo 功能,需要手动开启。
在 PostgreSQL 中启用 Undo 功能需要进行以下步骤:

  1. 确认 PostgreSQL 的版本是否支持 Undo 功能,目前仅支持 PostgreSQL 14 或更高版本

  2. 在 PostgreSQL 配置文件 postgresql.conf 中增加以下配置:

wal_level = logical
max_replication_slots = 1
max_wal_senders = 1
wal_log_hints = on

其中,wal_level 配置项需要设置为 logical,表示开启逻辑复制功能,max_replication_slotsmax_wal_senders 配置项需要设置为 1,表示开启一个逻辑复制槽和一个 WAL 发送者,wal_log_hints 配置项需要设置为 on,表示开启 WAL 日志提示功能。

  1. 创建 Undo 日志文件存储目录和表空间。
CREATE TABLESPACE undo LOCATION '/path/to/undo';
CREATE DIRECTORY '/path/to/undo';

其中,/path/to/undo 是你指定的 Undo 日志文件存储目录。

  1. 在 PostgreSQL 中创建 Undo 表空间。
CREATE UNDO TABLESPACE undo_tablespace LOCATION '/path/to/undo';

其中,/path/to/undo 是你指定的 Undo 日志文件存储目录。

  1. 在需要使用 Undo 功能的数据库中创建 Undo 表。
CREATE UNDO TABLESPACE undo_tablespace;
  1. 开启事务,进行数据修改操作,然后回滚事务,查看 Undo 表中的数据是否被恢复到修改前的状态。

需要注意的是,Undo 日志文件可能会占用大量的磁盘空间,因此需要根据实际情况进行配置和管理。

在 PostgreSQL 14 之前,没有官方的 Undo 功能。 但是,可以通过以下方法实现类似 Undo 的功能:

  1. 在需要进行修改操作的表中添加一个历史表,用于记录每次修改前的数据。
CREATE TABLE my_table_history AS SELECT * FROM my_table WHERE 1 = 0;
  1. 在修改前,将原表中的数据插入到历史表中。
INSERT INTO my_table_history SELECT * FROM my_table;
  1. 进行数据修改操作。
UPDATE my_table SET column1 = 'new_value' WHERE id = 1;
  1. 如果需要回滚操作,可以将历史表中的数据重新插入到原表中。
INSERT INTO my_table SELECT * FROM my_table_history WHERE id = 1;

需要注意的是,这种方法需要手动编写 SQL 语句进行回滚操作,比较麻烦。而且,如果有大量的修改操作,历史表可能会占用大量的磁盘空间,需要进行定期清理。因此,建议在 PostgreSQL 14 或更高版本中使用官方的 Undo 功能。

相关文章:

Postgres SELECT INSERT 流程 ?

SELECT 当执行SELECT查询时,PostgreSQL数据库会按照以下流程进行处理: 首先,查询语句会被发送到服务器。 服务器会接收查询请求,并根据查询条件从表中读取数据。 数据库会将数据存储在磁盘上的数据文件中,然后将其读…...

OpenAI推企业版ChatGPT,英伟达造AI安全卫士

GPT现在已经进入了淘金时代。虽然全球涌现出成千上万的大模型或ChatGPT变种,但一直能挣钱的人往往是卖铲子的人。 这不,围绕暴风眼中的大模型,已经有不少企业,开始研究起了大模型的“铲子”产品,而且开源和付费两不误…...

【原创】运维的终点是开发~chatGPT告诉你真相

文章目录 软件技术岗位鄙视链,你在哪层呢?让chatGPT告诉你运维工作好,还是开发工作好问它几个问题来自你的消息: 一个三年开发成长的案例和薪资来自ChatAI的消息:来自你的消息: 一个三年运维成长的案例和薪资来自ChatAI的消息:来自你的消息: …...

SSH 服务器、NFS 服务器、TFTP 服务器详解及测试

文章目录 前言一、SSH 服务器1、SSH 能做什么?2、安装 SSH 服务器3、测试 SSH 服务4、用 SecureCRT 测试 二、NFS 服务器1、NFS 能做什么?2、安装 NFS 软件包3、添加 NFS 共享目录4、启动 NFS 服务5、测试 NFS 服务器 三、TFTP 服务器1、TFTP 能做什么&a…...

1.3 HBase 基本架构

架构角色: 1)Master 实现类为 HMaster,负责监控集群中所有的 RegionServer 实例。主要作用如下: (1)管理元数据表格 hbase:meta,接收用户对表格创建修改删除的命令并执行 (2&#x…...

微机作业题

答案做的,正确性不保证。 1. 微型计算机的性能主要取决( A )的性能。 A. CPU B. 显示器 C. 硬盘 D. U盘 2. 计算机的工作过程,本质是( A )的过程。 A. 进行科学计算 …...

非极大值抑制详细原理(NMS含代码及详细注释)

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…...

女朋友说总是记不住Git命令,怎么办?安排!

如果你也和我女朋友一样总是忘记Git命令,觉得记忆Git命令是很枯燥和麻烦的事情。我写了一个包含了40 条常用Git命令的清单。你一定要收藏起来,当你忘记Git命令的时候,就可以打开来查看啦!!! 1.初始化本地仓…...

【ChatGLM】本地版ChatGPT ?6G显存即可轻松使用 !ChatGLM-6B 清华开源模型本地部署教程

目录 感谢B站秋葉aaaki大佬 前言 部署资源 部署流程 实机演示 ChatGML微调(人格炼成)(个人感觉蛮有趣的地方) 分享有趣の微调人格 实机演示(潘金莲人格) 感谢B站秋葉aaaki大佬 秋葉aaaki的个人空间…...

【MySQL】练习六 关系数据理论及数据库设计

文章目录 主要内容练习题一、选择题二、填空题三、判断题四、简答题主要内容 一个不好的关系模式可能存在的问题;函数依赖及三种函数依赖的定义:完全、部分、传递范式及1NF/2NF/3NF/BCNF的判定模式分解数据库设计的基本步骤概念设计(E-R图)逻辑模型(E-R图转换为逻辑模型的…...

UG NX二次开发(C++)-建模-修改NXObject或者Feature的颜色(一)

文章目录 1、前言2、在UG NX中修改Feature的颜色操作3、采用NXOpen(C)实现3.1 创建修改特征的方法3.2 调用ModifyFeatureColor方法3.3 测试结果 1、前言 在UG NX中,改变NXObject和Feature的操作是不相同的,所以其二次开发的代码也不一样,我们…...

全球天气weather.com的icon汇总表 天气现象代码枚举

全球天气weather.com的icon汇总表 天气现象代码枚举 Icon代码天气情况(列举常见情况,不包含全部)3大暴雨、大暴雨伴有风4大雷雨、强雷雨、雷雨、雷雨伴有风5雨或雪、雨伴有阵雪6雨夹冰粒、雨夹冰粒伴有风7雨夹雪、小雨夹雪、雪伴有冰粒和风、小雨夹雪伴有风、雪伴有冰粒8冻毛雨…...

【Python】【进阶篇】16、settings.py配置文件详解

目录 settings.py配置文件详解1. settings.py文件介绍1) BASE_DIR2) SECRET_KEY3) DEBUG4) ALLOWED_HOSTS5) INSTALLED_APPS6) MIDDLEWARE7) ROOT_URLCONF8) TEMPLATES9) WSGI_APPLICATION10) DATABASES11) AUTH_PASSWORD_VALIDATORS12) LANGUAGE_CODE和TIME_ZONE13) USE_118N和…...

【华为机试】HJ1 字符串最后一个单词的长度

【华为机试】 HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾) 输入描述: 输入一行,代表要计算的字符串…...

Spring DI简介及依赖注入方式和依赖注入类型

目录 一、什么是依赖注入 二、依赖注入方式 1. Setter注入 2. 构造方法注入 3. 自动注入 三、依赖注入类型 1. 注入bean类型 2. 注入基本数据类型 3. 注入List集合 4. 注入Set集合 5. 注入Map集合 6. 注入Properties对象 往期专栏&文章相关导读 1. Maven系…...

ES6栈方法和队列方法

在 JavaScript 这门语言中,栈和队列是非常重要的数据结构,它们可以帮助我们更好地组织和管理数据。我们可以使用 ES6 标准中新增的方法来实现栈和队列的操作。这篇文章将介绍 ES6 中数组的栈方法和队列方法。 栈(Stack) 栈是一种后进先出(L…...

EventBus(事件总线)的使用和源码的简单解析

Google Guava EventBus(事件总线)的使用和源码的简单解析 什么是EventBus? 事件总线(EventBus)是一种广泛用于软件架构中的设计模式,用于实现解耦和松散耦合的通信机制。它可以帮助组织和管理应用程序中不同组件之间的通信&…...

《汇编语言》- 读书笔记 - 第2章-寄存器

《汇编语言》- 读书笔记 - 第2章-寄存器 2.0 8086CPU 寄存器段地址:偏移地址 2.1 通用寄存器2.2 字在寄存器中的存储2.3 几条汇编指令表2.1汇编指令举例表2.2 程序段中指令的执行情况之一问题 2.1表2.3 程序段中指令的执行情况之二问题 2.2 检测点 2.12.4 物理地址2.5 16位结构…...

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三 主题整体听一遍精听句子 1扩展 way of doing | way to do sth 句子 2扩展 Expression扩展 base 句子 3句子 4扩展 red-hot 句子 5句子 6扩展 fiery 句子 7句子 8句子 9句子 10句子 11扩展 born 句子 12句子 13句子…...

50道web前端工程师面试题及答案解析,你学会了吗

简介:本文包含了50个实用的前端面试题及答案解析,涵盖了HTML、CSS、JavaScript、DOM、Ajax、MVC、模块化、ES6、SPA、Webpack、Babel、Virtual DOM、响应式设计、移动优先设计、响应式图片、CSS 预处理器、后处理器、模块化、布局、盒模型、浮动、定位、…...

【链表OJ题 1】反转链表

目录 题目来源: 代码实现 1、方法一 1.1分析 2、方法二 2.1 分析 题目来源: 力扣 题目描述: 代码实现 1、方法一 struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev NULL, * cur head;while (cur){st…...

【华为OD机试真题】计算网络信号 (javaC++python)100%通过率 超详细代码注释

计算网络信号 知识点广搜数组 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值,注意:网络信号可以绕过阴隔物array[m][n]的一维数组代表网格地图,array[i][j]=0代表i…...

Tomcat8和Tomcat9乱码问题

今天新开了一个小项目,我丢,乱码了,咋回事,好久没遇到过了,都忘了咋回事。今天必须记录下来,避免继续踩坑 Tomcat 8 不需要进行任何配置即可,它默认的是GBK,而win10 win7 默认的也是…...

Lesson13 IP协议

IP: 提供一种能力,将数据从A主机送到B主机的能力,但不一定会成功 主机 : 配有 IP 地址 , 但是不进行路由控制的设备 ; 路由器: 即配有 IP 地址 , 又能进行路由控制 ; 节点 : 主机和路由器的统称; 协议头格式 如何封装和解包: 定长报头 自描述字段 如何交付(分用) : 8…...

【每日一题Day192】LC1033移动石子直到连续 | 分类讨论 贪心

移动石子直到连续【LC1033】 三枚石子放置在数轴上,位置分别为 a,b,c。 每一回合,你可以从两端之一拿起一枚石子(位置最大或最小),并将其放入两端之间的任一空闲位置。形式上,假设这…...

2023年软件测试常见面试题100%问必背全套教程

随着数字化时代的到来,软件测试越来越受到重视。在未来的几年里,软件测试将继续成为信息技术领域中的热门职业之一。如果你是一名正在寻找或准备进入软件测试行业的人,那么这套常见面试题全套教程对你来说会非常有用。 这套教程旨在帮助你了…...

TypeScript 基本概念

TypeScript 是什么? 目标:能够说出什么是 TypeScript TS 官方文档 TS 中文参考 - 不再维护 TypeScript 简称:TS,是 JavaScript 的超集,JS 有的 TS 都有 TypeScript Type JavaScript(在 JS 基础之上…...

libfacedetection 人脸检测库 检测速度慢的问题

目录 一、libfacedetection 性能介绍 英特尔CPU 使用AVX2指令集 使用AVX512指令集 嵌入式设备 二、加速检测速度 libfacedetetion的前向推理速度很快的原因 使用axv2加速指令 一、libfacedetection 性能介绍 在上一篇文章中,我发现使用摄像头检测,构…...

项目骨架搭建

CSS样式补充 精灵图 CSS精灵图(CSS Sprites)是一种网页优化技术,通过将多个小图像合并成一个大图像,然后通过CSS的背景定位(background-position)属性来显示对应的图像部分。这种技术可以减少HTTP请求次数…...

“火灾不分昼夜,安全在我心中”——五一前厂房消防检查纪实

检查人员: Scott, Jason, Willson, Hanson 检查时间: 2023年4月28日 检查地点: 1厂房、2厂房室内外 检查内容: 一、室内外消火栓: 室内栓外观正常; 室外栓: 栓体防冻防尘套破损、遗失,消防栓缺少防撞保护; 按规定距离厂房外墙不宜小于5…...

h5网站建设机构/新网域名注册官网

this关键字是一个非常重要的语法点。毫不夸张地说&#xff0c;不理解它的含义&#xff0c;大部分开发任务都无法完成。记住一点&#xff1a;this不管在什么地方使用&#xff1a;它永远指向一个对象。一、一般使用this有以下几个场景&#xff1a;1.普通函数中&#xff1b;<sc…...

个体户查名字是否被注册/深圳seo秘籍

package com.sgg.text01;import java.util.Iterator; // JavaSE 5.0 中提供了 Varargs(variable number of arguments)机制&#xff0c; // 允许直接定义能和多个实参相匹配的形参。从而&#xff0c;可以用一种更简单的方式&#xff0c; // 来传递个数可变的实参。// JDK 5.0以…...

温州品牌网站设计/南宁seo营销推广

目录 一、List 接口 1. 概述 2. List 接口中的抽象方法&#xff08;特有&#xff09; 3. List 遍历 二、ListIterator 接口 1.概述 2. ListIterator 接口的抽象方法 3. List 逆向遍历&#xff1a; 三、迭代器的并发修改异常 1. 迭代器的并发修改异常 2. 出现场景&#xff1a; …...

体育局网站建设方案/免费舆情网站

简单比较 java,c#,php 创建类&#xff0c;继承&#xff0c;创建对象的异同点。 先简单用三种语言创建两个类Human&#xff0c;Singer,其中Singer继承Human。 相同点&#xff1a; 1可以使用继承&#xff0c;并且只能继承一个类&#xff0c;不能多重集成&#xff0c;但是接口可以…...

前端个人介绍网站模板下载/百度招聘2022年最新招聘

由图中可见&#xff0c;当前使用的是 unittest 测试框架 修改方式如下&#xff1a;...

小游戏网站审核怎么做/十大计算机培训学校

判断一个整数是否是回文数。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数 输入: 121 输出: true 输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 输入: 10 输…...