Postgresql内核源码分析-表数据膨胀是怎么回事
- 专栏内容:postgresql内核源码分析
- 个人主页:我的主页
- 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.
目录
前言
表数据膨胀的由来
什么时候产生膨胀
首先是update
还有delete
如何消除膨胀
结尾
前言
本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。
在我们使用postgresql数据库时,总会产生一些数据膨胀,导致查询变慢,索引失效,为什么会有数据膨胀呢?产生后我们怎么做才能让数据库恢复正常呢?
表数据膨胀的由来
话说数据库的四大特性ACID,postgresql采用了一种MVCC(Multi Version Concurrency Control)机制来保证事务的原子性和隔离性。
那什么是MVCC呢,简单说就是利用事务号递增性来标识tuple的新旧版本,达到不同事务内看到的tuple隔离;下面我们用一个例子来看一下:
查看一张表的当前数据;
postgres=# select ctid,xmin,xmax,id from t1;
ctid | xmin | xmax | id
-------+------+------+----
(0,1) | 1699 | 0 | 1
(0,2) | 1700 | 0 | 2
(2 rows)
我们在一个事务中执行更新并回滚
postgres=*begin;
BEGIN
postgres=*# select txid_current();
txid_current
--------------
1702
(1 row)
postgres=*update t1 SET name='a' where id=1;
UPDATE 1
postgres=*rollback;
ROLLBACK
我们在插入数据
insert into t1(id) values(3);
insert into t1(id) values(4);
postgres=# select ctid,xmin,xmax,id from t1;
ctid | xmin | xmax | id
-------+------+------+----
(0,1) | 1699 | 1702 | 1
(0,2) | 1700 | 0 | 2
(0,4) | 1703 | 0 | 3
(0,5) | 1704 | 0 | 4
(4 rows)
发现ctid为(0,3)的位置被跳过了,因为有一个id=1的tuple版本占了,只是它可见性判断时被判定为不可见,所以我们看不到它,但确实是占用了一个位置。
什么时候产生膨胀
那些常见情况下为产生多版本数据呢?
-
首先是update
我们来看一下update的演示:
我们update一条数据后,它的位置变到了最后,说明又一条旧版本;详细表的update代码解析详见我的专栏;
postgres=# update t1 SET name='a' where id=1;
UPDATE 1
postgres=# select ctid,xmin,xmax,id from t1;
ctid | xmin | xmax | id
-------+------+------+----
(0,2) | 1700 | 0 | 2
(0,4) | 1703 | 0 | 3
(0,5) | 1704 | 0 | 4
(0,6) | 1705 | 0 | 1
(4 rows)
-
还有delete
这里不会产生多版本,但是delete后,tuple并不会从表里真正删掉,而是打了一个标记,这样做的目的其它和多版本是一致的,因为可能还有其它事务在引用。
下面我们看一下例子:
postgres=# delete from t1 where id = 1;
DELETE 1
postgres=# select ctid,xmin,xmax,id from t1;
ctid | xmin | xmax | id
-------+------+------+----
(0,2) | 1700 | 0 | 2
(0,4) | 1703 | 0 | 3
(0,5) | 1704 | 0 | 4
(3 rows)
postgres=# insert into t1(id) values(5);
INSERT 0 1
postgres=# select ctid,xmin,xmax,id from t1;
ctid | xmin | xmax | id
-------+------+------+----
(0,2) | 1700 | 0 | 2
(0,4) | 1703 | 0 | 3
(0,5) | 1704 | 0 | 4
(0,7) | 1707 | 0 | 5
(4 rows)
我们delete后又insert,发现空闲(0,6)没有被利用,而是从(0,7)开始;
如何消除膨胀
postgresql在运行过程中,采用了两种方式:
一是页面裁剪;
二是autovacuum;
那它们是如何做的呢?请看本专栏内容。
结尾
作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。
注:未经同意,不得转载!
相关文章:
Postgresql内核源码分析-表数据膨胀是怎么回事
专栏内容:postgresql内核源码分析个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 表数据膨胀的由来 什么时候产生膨胀 首先是update 还有delete 如何消…...
github使用SSH进行克隆仓库
SSH 密钥拉取git 查询密钥是否存在 s -al ~/.ssh这个文件夹下 known_hosts 就是存在的密钥文件 创建密钥文件 ssh-keygen -t rsa -b 4096 -C "testtt.com"-t rsa 是 rsa 算法加密 -b 是指定密钥的长度(以位为单位)。 -C 是用于给密钥添加注…...
【Linux系统】 Linux内核与UNIX设计哲学的结合
Linux 内核虽然不是 UNIX 的直接衍生物,但它深受 UNIX 设计哲学的影响。Linux 的开发者,尤其是 Linus Torvalds,在设计和实现 Linux 时,借鉴了 UNIX 的核心思想,使 Linux 成为一个类 UNIX 系统。 以下从 UNIX 设计哲学…...
以太网PHY_RGMII通信(基于RTL8211)--FPGA学习笔记22
一、以太网基础知识 FPGA千兆网口数据传输MDIO接口——FPGA学习笔记3_yt8531sh原理图-CSDN博客 二、通信协议 1、MDIO协议格式 (1)Pre:前导码32bit全是1,同步通信 32bit (2)ST:开始字段 01 表示开始通信 2bit…...
PowerShell 脚本实战:解决 GitLab 仓库文件批量重命名难题
使用PowerShell脚本解决文件重命名问题:一次实践经验分享 在软件开发过程中,我们经常会遇到需要批量处理文件的情况。最近,我在一个项目中就遇到了这样一个需求:将GitLab仓库中所有的.ts和.py文件的扩展名修改为原扩展名加上&quo…...
数据分析及应用:滴滴出行打车日志数据分析
目录 0 日志数据集介绍 1 构建数据仓库 1.1 ods创建用户打车订单表 1.2 创建分区 1.3 上传到对应分区...
Odoo :一款免费且开源的食品生鲜领域ERP管理系统
文 / 贝思纳斯 Odoo金牌合作伙伴 引言 提供业财人资税的精益化管理,实现研产供销的融通、食品安全的追踪与溯源,达成渠道的扁平化以及直面消费者的 D2C 等数字化解决方案,以此提升运营效率与核心竞争力,支撑高质量的变速扩张。…...
请求路径中缺少必需的路径变量[xxxId]
一、请求路径中缺少了必需的路径变量 xxxId。 这通常发生在构建API请求时,未正确设置URL中的参数。以下是解决此问题的步骤: 检查API文档:确认 xxxId是否确实是请求路径中的必需参数。 构建请求URL:确保在构建请求URL时ÿ…...
【在Linux世界中追寻伟大的One Piece】HTTP cookie
目录 1 -> 引入HTTP cookie 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 分类 1.4 -> 安全性 2 -> 认识cookie 2.1 -> 基本格式 2.2 -> GMT vs UTC 3 -> cookie的生命周期 3.1 -> 安全性考虑 3.2 -> 安全测试cookie 3.2.1 -> 测试co…...
COLA学习之DDD各种术语分析(一)
小伙伴们,你们好,我是老寇,前段时间,老寇刚看完张健飞老师的两本书《代码精进之路:从码农到工匠》和《程序员的底层思维》,书中的内容让我受益匪浅,因此,我把对COLA的理解做成专栏分…...
Pygments:高效的语法高亮工具
简介:Pygments 是一个强大的 Python 库,旨在为代码和文本提供优雅的语法高亮支持。无论是 Web 开发、文档生成,还是代码审阅,Pygments 都能轻松应对多种编程语言的高亮需求。其设计简洁、功能丰富,适合需要频繁进行代码…...
算法-字符串-43.字符串相乘
一、题目 二、思路解析 1.思路: 1.双重for循环,倒序依次相乘 2.在倒序处理进位问题 3.最后返回参数的类型是string,用StringBuilder拼接,再转换为字符串 2.常用方法: 1.equals,比较对象内容是否一致 "0".eq…...
linux的vdagent框架设计
1、vdagent Linux 的 spice 客户代理由两部分组成,一个系统范围的守护进程 spice-vdagentd 和一个 X11 会话代理 spice-vdagent,每个 X11 会话有一个。spice-vdagentd 通过 Sys-V initscript 或 systemd 单元启动。 如下图:spice-vdagent&a…...
CV工程师专用键盘开源项目硬件分析
1、前言 作为一个电子发烧友,你是否有遇到过这样的问题呢。当我们去查看函数定义的时候,需要敲击鼠标右键之后选择go to definition。更高级一些,我们使用键盘的快捷键来查看定义,这时候可以想象一下,你左手按下ALT&a…...
qtcanpool 知 08:Docking
文章目录 前言口味改造后语 前言 很久以前,作者用 Qt 仿照前端 UI 设计了一个 ministack(https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h) 控件,这个控件可以折叠。部分用户体验后&#…...
Milvus向量数据库01-基础概念
Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection,然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …...
mysql备份数据库
MySQL备份/还原 的方法 mysql备份数据库 mysql备份单个数据库 #mysql备份某个库格式: mysqldump -h主机名 -P端口 -u用户名 -p"密码" --database 数据库名 > 文件名.sql#实例:mysql备份某个库: mysqldump -h10.*.*.9 -P3306 …...
NLP与LLM的工程化实践与学习思考 - 写在开头
NLP与LLM的工程化实践与学习思考[24年半年工作总结] - 写在开头 0 开头的开头 0 开头的开头 24年因为一些工作原因,短暂在NLP领域遨游了半年。这半年对我的影响蛮大,一来是因为此前从没接触过这个方向学到新东西挺开心的,二来是在工程化实践…...
LeetCode322. 零钱兑换(2024冬季每日一题 28)
给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示…...
Unix、GNU、BSD 风格中 ps 参数的区别
注:本文为“不同风格中 ps 命令参数的区别”相关文章合辑。 未去重。 BSD 风格和 UNIX 风格中 ps 参数的区别 作者:Daniel Stori 译者:LCTT Name1e5s | 2017-06-17 10:53 One Last Question ps aux 以及 ps -elf 都是查看进程的方式&…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
MeshGPT 笔记
[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭!_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...
