Postgres SELECT INSERT 流程 ?
SELECT
当执行SELECT查询时,PostgreSQL数据库会按照以下流程进行处理:
-
首先,查询语句会被发送到服务器。
-
服务器会接收查询请求,并根据查询条件从表中读取数据。
-
数据库会将数据存储在磁盘上的数据文件中,然后将其读取到内存中进行处理。
-
数据库会对数据进行排序、过滤、聚合等操作。
-
查询结果会被发送回客户端。
-
客户端会接收到查询结果,并将其显示在屏幕上。
在查询执行过程中,PostgreSQL数据库会使用多种技术来提高查询性能,例如使用索引、分区表、并行查询等。同时,PostgreSQL还支持多种查询语句,例如JOIN、GROUP BY、HAVING等,可以帮助用户更加灵活地查询数据。
缓存
当PostgreSQL执行SELECT查询时,会涉及到三个重要的缓存:Shared Buffers、OS Cache和Disk Cache。下面分别介绍这三个缓存的作用:
-
Shared Buffers:这是PostgreSQL自己实现的内存缓存,用于缓存最常用的数据块。当查询需要读取数据时,PostgreSQL首先会从Shared Buffers中查找数据,如果没有找到,则需要从磁盘上的数据文件中读取数据。
-
OS Cache:这是操作系统提供的内存缓存,用于缓存已经读取过的数据块。当PostgreSQL需要读取数据时,如果数据已经被缓存在OS Cache中,则可以直接从OS Cache中读取数据,而不需要从磁盘上的数据文件中读取。
-
Disk Cache:这是磁盘本身提供的缓存,用于缓存磁盘上的数据块。当数据被写入磁盘时,数据会先被写入Disk Cache中,然后再由操作系统将数据写入磁盘。当需要读取数据时,如果数据已经被缓存在Disk Cache中,则可以直接从Disk Cache中读取数据,而不需要从磁盘上的数据文件中读取。
在查询执行过程中,PostgreSQL会根据需要将数据缓存在这三个缓存中,以提高查询性能。同时,当数据被修改时,PostgreSQL会将修改的数据缓存在Shared Buffers中,然后定期将缓存中的脏数据刷回磁盘。具体的刷脏流程如下:
-
当数据被修改时,数据会被标记为脏数据。
-
当Shared Buffers中的脏数据达到一定程度时,PostgreSQL会将脏数据写入磁盘,并将数据标记为干净数据。
-
如果磁盘上的数据文件已经被写满,则需要将部分干净数据写入磁盘,以腾出空间。
-
当数据被写入磁盘后,PostgreSQL会将数据从Shared Buffers中移除。
-
当需要读取数据时,PostgreSQL会首先从Shared Buffers中查找数据,如果没有找到,则需要从磁盘上的数据文件中读取。如果数据已经被缓存在OS Cache或Disk Cache中,则可以直接从OS Cache或Disk Cache中读取数据,而不需要从磁盘上的数据文件中读取。
综上所述,PostgreSQL的查询执行过程涉及到多个缓存和刷脏机制,这些机制可以提高查询性能,并保证数据的一致性和持久性。
INSERT
当执行 INSERT 操作时,PostgreSQL 会将新数据插入到对应的表中。这个过程可以被分为以下几个步骤:
-
检查是否有足够的权限:在执行 INSERT 操作之前,PostgreSQL 会检查当前用户是否有足够的权限来执行该操作。如果用户没有足够的权限,则操作将被拒绝。
-
检查约束条件:在执行 INSERT 操作之前,PostgreSQL 会检查表的约束条件是否被满足。如果约束条件不被满足,则操作将被拒绝。
-
分配事务 ID:在执行 INSERT 操作之前,PostgreSQL 会为该操作分配一个唯一的事务 ID。这个事务 ID 在事务提交或回滚时被使用。
-
写入 WAL 日志:在执行 INSERT 操作之后,PostgreSQL 会将该操作写入 WAL(Write-Ahead Logging)日志。这个日志记录了数据库的所有修改操作,以便在数据库崩溃时可以恢复数据。
-
刷脏缓存:在执行 INSERT 操作之后,PostgreSQL 会将新数据写入到共享缓存中。如果该数据已经存在于缓存中,则该数据将被更新。在这个过程中,PostgreSQL 会标记缓存中的数据为“脏数据”,表示该数据已经被修改但还没有被写入到磁盘中。
-
刷脏数据到磁盘:在执行 INSERT 操作之后,PostgreSQL 会将脏数据写入到磁盘中。这个过程被称为“刷脏”。在这个过程中,PostgreSQL 会使用 WAL 日志来确保数据的一致性和可恢复性。
-
更新索引:在执行 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 功能需要进行以下步骤:
-
确认 PostgreSQL 的版本是否支持 Undo 功能,目前仅支持 PostgreSQL 14 或更高版本。
-
在 PostgreSQL 配置文件
postgresql.conf
中增加以下配置:
wal_level = logical
max_replication_slots = 1
max_wal_senders = 1
wal_log_hints = on
其中,wal_level
配置项需要设置为 logical
,表示开启逻辑复制功能,max_replication_slots
和 max_wal_senders
配置项需要设置为 1
,表示开启一个逻辑复制槽和一个 WAL 发送者,wal_log_hints
配置项需要设置为 on
,表示开启 WAL 日志提示功能。
- 创建 Undo 日志文件存储目录和表空间。
CREATE TABLESPACE undo LOCATION '/path/to/undo';
CREATE DIRECTORY '/path/to/undo';
其中,/path/to/undo
是你指定的 Undo 日志文件存储目录。
- 在 PostgreSQL 中创建 Undo 表空间。
CREATE UNDO TABLESPACE undo_tablespace LOCATION '/path/to/undo';
其中,/path/to/undo
是你指定的 Undo 日志文件存储目录。
- 在需要使用 Undo 功能的数据库中创建 Undo 表。
CREATE UNDO TABLESPACE undo_tablespace;
- 开启事务,进行数据修改操作,然后回滚事务,查看 Undo 表中的数据是否被恢复到修改前的状态。
需要注意的是,Undo 日志文件可能会占用大量的磁盘空间,因此需要根据实际情况进行配置和管理。
在 PostgreSQL 14 之前,没有官方的 Undo 功能。 但是,可以通过以下方法实现类似 Undo 的功能:
- 在需要进行修改操作的表中添加一个历史表,用于记录每次修改前的数据。
CREATE TABLE my_table_history AS SELECT * FROM my_table WHERE 1 = 0;
- 在修改前,将原表中的数据插入到历史表中。
INSERT INTO my_table_history SELECT * FROM my_table;
- 进行数据修改操作。
UPDATE my_table SET column1 = 'new_value' WHERE id = 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 预处理器、后处理器、模块化、布局、盒模型、浮动、定位、…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...