PostgreSQL内幕探索—基础知识
PostgreSQL内幕探索—基础知识
PostgreSQL(以下简称PG) 起源于 1986 年加州大学伯克利分校的 POSTGRES 项目,最初以对象关系模型为核心,支持高级数据类型和复杂查询功能。
1996 年更名为 PostgreSQL 并开源,逐步发展为功能全面的企业级关系型数据库系统,支持 SQL 标准并持续扩展特性(如多版本并发控制、地理空间数据支持等)
PG基础知识
大致从下面几个方面来了解PG的基础知识
- 数据集簇
- 数据库
- 表和索引
- 表空间
- 表文件
- 元组
数据集簇
数据集簇是一组数据库的集合,由一个PG服务器进行管理,可以简单理解为一个数据库实例。我们通过一张图来了解一个数据集簇的逻辑结构,如下图所示
逻辑结构
从图中我们可以知道,一个数据集簇中可以有多个数据库,每个数据库中包含了不同的对象,例如表table、索引index、视图view等。每个对象都有唯一的一个标识,称之为对象标识符oid,PG通过oid来管理各个对象。数据库中对象与oid的映射关系存储在对应的系统目录中,因对象不同有所差异,例如数据库对象存在于pg_database下,而堆表对象存在于pg_class下。如果需要查找对象的oid,可以使用下面的语句
# 查询数据库对象的oid
select datname,oid from pg_database where datname = 'testdb';# 查询表对象的oid
select relname,oid from pg_class where relname = 't1';
物理结构
上面了解了数据集簇的逻辑结构,我们现在来认识数据集簇的物理结构。数据集簇的物理结构本质上是一个文件目录,包含了很多子目录和文件,通过initdb可以在指定目录$PGDATA
下创建一个初始化的数据集簇。下面的重要目录包含了base目录,默认有几个模板数据库,可以直接在目录下直接看到他们的oid。新创建的数据库都会在这个目录下面
数据集簇布局
这里直接摘用文章中的内容来详细展示数据集簇的布局,列出主要的文件和子目录
- 文件
文件 | 描述 |
---|---|
PG_VERSION | 包含PG主版本号的文件 |
pg_hba.conf | 控制PG的客户端认证 |
pg_ident.conf | 控制PG的用户名映射 |
postgresql.conf | 参数配置文件 |
postgresql.auto.conf | 存储使用alter system命令修改的配置参数 |
postmaster.opts | 记录上次启动的命令行选项 |
- 子目录
子目录 | 描述 |
---|---|
base/ | 每个数据库的子目录皆存储在此 |
global/ | 数据集簇范围的表以及pg_control文件 |
pg_commit_ts/ | 事务提交时间戳(9.5+) |
pg_clog/ | 事务提交状态日志 |
pg_dynshmem/ | 动态共享内存子系统使用的文件 |
pg_logical/ | 逻辑解码的状态数据 |
pg_mulixact/ | 多事务状态数据 |
pg_notify/ | LISTEN/NOTIFY数据 |
pg_repslot/ | 复制槽数据(9.4+) |
pg_serial/ | 已提交的可串行化事务数据 |
pg_snapshots/ | 存储导出的快照信息 |
pg_stat/ | 统计子系统的永久文件 |
pg_stat_temp/ | 统计子系统的临时文件 |
pg_subtrans/ | 子事务状态数据 |
pg_tblspc/ | 指向表空间的符号连接 |
pg_twophase/ | 两阶段事务的状态文件 |
pg_xlog/ | wal日志文件 |
数据库布局
在base子目录下有对应的oid目录,例如testdb的oid为16384,那么目录为base/16384
表和索引文件布局
每个小于1GB的表或者索引都在相应的数据库目录下存在对应的文件。数据库内部,表和索引是用oid进行管理的,但是在文件上有所差异,文件中使用的是refilenode
,这个refilenode
一般和oid相同,但是如果表发生了truncate、reindex、cluster等命令被改变,那么这个refilenode
就会发生改变。
使用内置函数pg_relation_filepath
可以轻松获取到表或索引对象的文件路径,当表或索引对象的数据超过了那么1GB之后,那么PG会创建一个refilenode.1
的新文件,如果新文件再次被用满,生成refilenode.2
文件,依此类推
在初始化PG时,可以通过--with-segsize
来指定表和索引文件的最大文件大小。
_fsm文件和_vm文件
每个表都有相关联的_fsm(空闲空间映射)文件和_vm(可见性映射)文件,分别存储了表文件上每个页面的空闲空间信息和可见性信息。索引只有_fsm文件
内部相关概念
在数据库内部,这些文件被称为相应的分支。一般有四种分支
- 0 数据文件本体
- 1 fsm保存空闲空间信息
- 2 vm保存可见性信息
- 3 不常见的特殊分支,表示不被日志记录的表和索引
表空间布局
表空间是在基础目录下附加的目录,在建表时指定表空间,那么会将此表的文件生成到该表空间的目录下,该目录下还会创建一个PG_主版本号_目录版本号
的目录。通过pg_tblspc
子目录进行关联
堆表文件内部布局
数据文件(堆表,索引,也包括vm和fsm文件)内部被划分为固定长度的页,或者叫区块,大小默认为8KB,可以在PG初始化的时候进行调整。每个文件中的页从0开始编号,称之为区块号。如果当前页被填满,那么在末尾追加一个新页来扩展文件大小。
堆表文件的布局如下图
下面来详细解释下表文件一个页(区块)中的三种数据类型
- 堆元组tuple:这里的tuple可以理解为行,存储的就是数据本身,从页面底部开始堆叠
- 行指针:保存者指向堆元组的指针,每个行指针占4B,形成一个简单的数组,扮演了元组索引的角色。每个索引项从1开始编号,这个编号称为偏移量。每次有新元组插入时,同时也会插入行指针,并指向新元组。
- 头部数据header:header中包含了很多重要的信息,下面一一列出
- pd_lsn 记录本页面最近一次变更写入xlog记录的lsn号,和wal机制相关
- pd_checksum 记录本页面的校验和值
- pd_lower、pd_upper pd_lower指向行指针的末尾,pd_upper指向最新元组的起始位置,可以使用pd_upper-pd_lower得到当前页大致的剩余可用空间
- pd_special 在索引页中会用到,在堆表页指向页尾。在索引中指向特殊区域的起始位置,特殊区域是仅由索引使用的特殊数据区域,例如btree,空间索引等
- pd_prune_xid 本页面中可以修剪的最老元组中的xid
为了标识表中的元组,数据库内部会使用元组标识符tid来管理。tid由一对值组成,分别是元组所在区块号和行指针数组的偏移量。
此外,大小如果超过了2KB(1/4)的堆元组会使用一种TOAST的方法来存储和管理
读写元组的方式
下面详细介绍下读写元组的流程,假设目前有一张表,这张表只有一个数据页,且页中只有一个tuple。
写元组
根据列子的情况,我们画出写入元组前后的对比
我们大致描述一下整体的步骤
- 从页面底部插入一条tuple,放在tuple1之后,将pd_upper的指针指向tuple2的起始位置
- 在行指针1后面生成一个行指针,偏移量为2,行指针2指向tuple2,pd_lower指向行指针2的末尾
- pd_lsn,pg_checksum,pg_flag也被修改为合适的值,后面详细展开说。
读元组
我们这里介绍两种常见的读取方式
- 顺序扫描:通过扫描每一页的行指针,依次读取所有页面的所有元组。
- btree索引扫描:索引文件中包含了索引元组,索引元组由一对值组成,key为索引列的值,value为目标元组的tid。这样可以直接通过索引读取到目标元组,避免不必要的页面扫描。
相关文章:
PostgreSQL内幕探索—基础知识
PostgreSQL内幕探索—基础知识 PostgreSQL(以下简称PG) 起源于 1986 年加州大学伯克利分校的 POSTGRES 项目,最初以对象关系模型为核心,支持高级数据类型和复杂查询功能。 1996 年更名为 PostgreSQL 并开源,逐…...
Springboot项目正常启动,访问资源却出现404错误如何解决?
我在自己的springboot项目中的启动类上同时使用了SprinBootApplication和ComponentScan注解, 虽然项目能够正常启动,但是访问资源后,返回404错误,随后在启动类中输出bean,发现controller创建失败: 而后我将ComponentScan去掉后资源就能访问到了. 原因 SprinBootApplication本身…...
MaxPooling层的作用(通俗解释)
MaxPooling层的作用(通俗解释) MaxPooling层是卷积神经网络中非常重要的组成部分,它的主要作用可以用以下几个简单的比喻来理解: 1. 信息压缩器(降维作用) 就像把一张高清照片缩小尺寸一样,M…...
0.DockerCE起步之Linux相关【完善中】
ubuntu用户组&权限&文件/目录 服务启停操作 sudo systemctl start docker # 启动服务3,4 sudo systemctl stop docker # 停止服务 sudo systemctl restart docker ps top 以下内容参考 Vim编辑器 Linux系统常用命令 管理Linux实例软件源 Cron定时任务 在Linux系统上…...
树莓派Pico C/C++ OpenOCD调试环境搭建(Windows)
树莓派Pico C/C OpenOCD调试环境搭建(Windows) 参考资料和背景 从上次树莓派Pico C/C 开发环境搭建(一键完成版)后,一直想找个合适调试器,最后测试了多种方案,还是使用另一块树莓派pico作为picoprobe 来调试比较方便,其中参考的…...
【图像生成之21】融合了Transformer与Diffusion,Meta新作Transfusion实现图像与语言大一统
论文:Transfusion: Predict the Next Token and Diffuse Images with One Multi-Modal Model 地址:https://arxiv.org/abs/2408.11039 类型:理解与生成 Transfusion模型是一种将Transformer和Diffusion模型融合的多模态模型,旨…...
《人件》第二章 办公环境
二、办公环境 电话铃不停的响,打印机维修人员顺道过来聊聊天,复印机不工作了,人事部不停催促更新的能力调查表,下午3点之前就要提交时间表…然后一天就这样过去了。 2.1 家具警察 人们怎么使用空间、需要的桌子空间多大、花多少小…...
哈希表系列一>存在重复元素II 存在重复元素I
目录 题目:解析:存在重复元素 II-->代码:存在重复元素-->代码: 题目: 链接: link 链接: link 解析: 存在重复元素 II–>代码: class Solution {public boolean containsNearbyDuplic…...
文献总结:AAAI2025-UniV2X-End-to-end autonomous driving through V2X cooperation
UniV2X 一、文章基本信息二、文章背景三、UniV2X框架1. 车路协同自动驾驶问题定义2. 稀疏-密集混合形态数据3. 交叉视图数据融合(智能体融合)4. 交叉视图数据融合(车道融合)5. 交叉视图数据融合(占用融合)6…...
LeetCode --- 444 周赛
题目列表 3507. 移除最小数对使数组有序 I 3508. 设计路由器 3509. 最大化交错和为 K 的子序列乘积 3510. 移除最小数对使数组有序 II 一、移除最小数对使数组有序 I & II 由于数组是给定的,所以本题的操作步骤是固定的,我们只要能快速模拟操作的过…...
单片机Day05---静态数码管
目录 一、原理图:编辑 二、思路梳理: 三:一些说明: 1.点亮方式: 2.数组: 3.数字与段码对应: 四:程序实现: 一、原理图: 二、思路梳理: …...
kernel32!GetQueuedCompletionStatus函数分析之返回值得有效性
第一部分://#define STATUS_SUCCESS 0x0返回值为0 } else { // // Set the completion status, capture the completion // information, deallocate the associated IRP, and // attempt to write the…...
gazebo 启动卡死的解决方法汇总
1. 排查显卡驱动是否正常安装 nvidia-smi # 英伟达显卡--------------------------------------------------------------------------------------- | NVIDIA-SMI 535.230.02 Driver Version: 535.230.02 CUDA Version: 12.2 | |------------------------…...
硬件设计-MOS管快速关断的原因和原理
目录 简介: 来源: MOS管快关的原理 先简单介绍下快关的原理: 同电阻时为什么关断时间会更长 小结 简介: 本章主要介绍MOS快速关断的原理和原因。 来源: 有人会问,会什么要求快速关断,而…...
塔能科技解节能密码,工厂成本“效益方程式”精准破题
在全球积极推进可持续发展战略的当下,各行业都在努力探索节能减排、绿色发展的新路径,对于工厂而言,节能早已不是锦上添花的选择,而已成为关乎企业生死存亡与长远发展的核心要素,是实现可持续运营的必由之路。塔能科技…...
swift ui基础
一个朴实无华的目录 今日学习内容:1.三种布局(可以相互包裹)1.1 vstack(竖直):先写的在上面1.1 hstack(水平):先写的在左边1.1 zstack(前后)&…...
格式工厂 v5.18最新免安装绿色便携版
前言 用它来转视频的时候,还能顺便给那些有点小瑕疵的视频修修补补,保证转出来的视频质量杠杠的。更厉害的是,它不只是转换那么简单,还能帮你把PDF合并成一本小册子,视频也能合并成大片,还能随心所欲地裁剪…...
CSPM认证对项目论证的范式革新:从合规审查到价值创造的战略跃迁
引言 在数字化转型浪潮中,全球企业每年因项目论证缺陷导致的损失高达1.7万亿美元(Gartner 2023)。CSPM(Certified Strategic Project Manager)认证体系通过结构化方法论,将传统的项目可行性评估升级为战略…...
TcxCustomCheckComboBoxProperties.EditValueFormat 值说明
TcxCheckStatesValueFormat 类枚举复选框状态对 edit 值的可能解释。以下选项可用。 价值 意义 cvf字幕 编辑值是一个字符串,其中包含两个由分号分隔的子字符串。分号前的子字符串包含灰显项目的标题列表。分号后面的子字符串包含已选中项目的标题列表。请注意&a…...
Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试
Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…...
【C语言】预处理(下)(C语言完结篇)
一、#和## 1、#运算符 这里的#是一个运算符,整个运算符会将宏的参数转换为字符串字面量,它仅可以出现在带参数的宏的替换列表中,我们可以将其理解为字符串化。 我们先看下面的一段代码: 第二个printf中是由两个字符串组成的&am…...
IIC通信协议
一、概述 IIC协议:是一种各种电子设备之间进行数据交换和通信的串行,半双工通信协议,主要用于近距离,低速的芯片之间的通信。 I2C协议采用双线结构传输数据,由一个数据线&#…...
SpringBoot原生实现分布式MapReduce计算(无第三方中间件版)
一、架构设计调整 核心组件替换方案: 注册中心 → 数据库注册表任务队列 → 数据库任务表分布式锁 → 数据库行级锁节点通信 → HTTP REST接口 二、数据库表结构设计 -- 节点注册表 CREATE TABLE compute_nodes (node_id VARCHAR(36) PRIMARY KEY,last_heartbea…...
02-libVLC的视频播放器:播放音视频文件以及网络流
libvlc_new(0, nullptr)功能:创建并初始化libVLC的核心实例,是使用所有libVLC功能的前提。 参数:第一个参数:参数数量(通常设为0)第二个参数:参数列表(通常为nullptr,表示使用默认配置)返回值:成功返回libvlc_instance_t*指针,失败返回nullptr。注意事项:可通过参…...
Autoware源码总结
Autoware源码网站 项目简介 教程 Autoware的整体架构如下图,主要包括传感器sensing、高精地图map data、车辆接口vehicle interface、感知perception(动态障碍物检测detection、跟踪tracking、预测prediction;交通信号灯检测detection、分类c…...
PowerBI 条形图显示数值和百分比
数据表: 三个度量值 销售额 SUM(销量表[销售量])//注意, 因为Y轴显示的产品,会被筛选,所以用ALLSELECTED来获取当前筛选条件下,Y轴显示的产品 百分比 FORMAT(DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED(销量表[产品编码]))),"0…...
Sa-Token 自定义插件 —— SPI 机制讲解(一)
前言 博主在使用 Sa-Token 框架的过程中,越用越感叹框架设计的精妙。于是,最近在学习如何给 Sa-Token 贡献自定义框架。为 Sa-Token 的开源尽一份微不足道的力量。我将分三篇文章从 0 到 1 讲解如何为 Sa-Token 自定义一个插件,这一集将是前沿…...
基于 Termux 在移动端配置 Ubuntu 系统并搭建工作环境
本套方案主要参考了以下内容,并根据自身体验进行了修改。 【教程】用Termux搭建桌面级生产力环境Termux安装完整版Linux(Ubuntu)详细步骤 前言 自己的电脑太重,有时候外出不想带,平板生产力有有限。所以一直在折腾用平板替代电脑的事情。之前…...
JAVA SDK通过proxy对接google: GCS/FCM
前言:因为国内调用google相关api需要通过代理访问(不想设置全局代理),所以在代理这里经常遇到问题,先说一下结论 GCS 需要设置全局代理或自定义代理选择器, FCM sdk admin 在初始化firebaseApp时是支持设置的。 GCS: 开始时尝试在…...
JAVA EE_多线程-初阶(三)
我对未来没有底气 我也不知道当下该如何做 那就活着,活着就能把日子过下去 ---------陳長生. 1.多线程案例 1.1.单例模式 单例模式是常见的设计模式之一 设计模式:一些编程大佬制定的一些通用代码,再特定的场景下能套用进去,即…...
@PKU秋招互联网产品经理求职分享
从校园到职场 非常荣幸能够在毕业后两年半再次回到燕园。今天,我主要想和大家分享一下我在互联网行业的求职和工作经验。从最初面对职场的迷茫,到现在能够从容应对职场各种挑战,这一路走来积累了不少心得。互联网行业变化迅速,持续…...
uniapp日常总结--uniapp页面跳转方式
uniapp日常总结--uniapp页面跳转方式_uniapp 跳转-CSDN博客...
【能源节约管理系统行业树组件优化总结】
能源节约管理系统行业树组件优化总结 问题背景 在能源节约管理系统中,我们需要一个行业选择组件,以树形结构展示国民经济行业分类数据。由于行业数据量大且层级多,我们采用了懒加载的方式实现。然而,在编辑和详情模式下…...
青少年编程考试 CCF GESP图形化编程 二级认证真题 2025年3月
图形化编程 二级 2025 年 03 月 一、单选题(共 10 题,每题 3 分,共 30 分) 1、2025 年春节有两件轰动全球的事件,一个是 DeepSeek 横空出世,另一个是贺岁片《哪吒 2》票房惊人,入了全球票房榜…...
【Hadoop入门】Hadoop生态之Flume简介
1 什么是Flume? Flume是Hadoop生态系统中的一个高可靠、高性能的日志收集、聚合和传输系统。它支持在系统中定制各类数据发送方(Source)、接收方(Sink)和数据收集器(Channel),从而能…...
十六、Linus网络编程基础
1、Linux 网络的历史发展 早期阶段(1991–1995) 1991年:Linus Torvalds 发布 Linux 内核的初始版本(0.01),此时内核不支持网络功能,仅是一个单机操作系统。1992年:受 BSD …...
【激活函数:神经网络的“调味料】
1. 激活函数:神经网络的“调味料” 想象你在做菜: 没有激活函数:就像只用水煮食材,味道单调(只能拟合线性关系)。加入激活函数:像加了盐、糖、辣椒,让菜有酸甜苦辣(非线…...
006.Gitlab CICD流水线触发
文章目录 触发方式介绍触发方式类型 触发方式实践分支名触发MR触发tag触发手动人为触发定时任务触发指定文件变更触发结合分支及文件变更触发正则语法触发 触发方式介绍 触发方式类型 Gitlab CICD流水线的触发方式非常灵活,常见的有如下几类触发方式: …...
服务器远程端口详解
服务器远程端口详解 一、服务器远程端口的概念与作用 1. 端口的基本定义 服务器远程端口是计算机网络中用于标识不同应用程序或服务的逻辑接口。通过TCP/IP协议栈的"Socket"机制,计算机可以通过软件方式与其他设备建立通信通道。每个端口对应一个16位无…...
如何在 Vue 3 中实现百度地图位置选择器组件
如何在 Vue 3 中实现百度地图位置选择器组件 前言 在开发前端应用时,地图选择器是一个非常常见的需求。尤其是在一些需要用户选择地址的场景,如电商平台、旅游网站、酒店预定等,百度地图组件能提供准确的地理位置服务。在本文中,…...
es6学习02-let命令和const命令
一、let命令 1.let块级作用域: let关键字 VS var关键字 2.for循环计数器很适合let命令 var:整个for循环中一直都是同一个i在做1,最后输出的就是10; let:每循环一次都是多一个i的赋值,最后输出是可以调出…...
电路方案分析(二十)TPS63xxx系列DC/DC电源EMI PCB设计方案
tips:资料来自网络,仅供学习使用。[TOC](TPS63xxx系列DC/DC电源EMI PCB设计方案) 1.概述 通过TPS63xxx系列DC/DC电源模块来分析降低直流/直流降压/升压转换器辐射 EMI 的来源以及相关PCB设计。 下面都以最常用的TPS63070为例说明: 典型应用…...
DeepSeek大语言模型部署指南:从基础认知到本地实现
目录 一、DeepSeek简介:开源领域的新兴力量 1.1 公司背景与发展历程 1.2 核心产品DeepSeek-R1的技术特点 1.3 行业影响与伦理挑战 二、官方资源获取:全面掌握DeepSeek生态 2.1 官方网站与API服务 2.2 开源代码库资源 2.3 模型部署工具Ollama简介…...
09-设计模式 企业场景 面试题-mk
你之前项目中用过设计模式吗? 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类图设计如下: 上面的对象都是ne…...
达梦数据库-学习-18-ODBC数据源配置(Linux)
一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存4G逻辑核数2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…...
解决VS2022中scanf报错C4996
这个的原因是因为新版的VS认为scanf不安全,要去使用scanf_s,但在C语言中就需要scanf,所以我们只要以以下步骤解决就可以了。 只要加入宏定义即可 #define _CRT_SECURE_NO_WARNINGS 因为本人已经很少写小案例了,所以就用这个办法…...
Python(11)Python判断语句全面解析:从基础到高级模式匹配
目录 一、条件逻辑的工程价值1.1 真实项目中的逻辑判断1.2 判断语句类型矩阵 二、基础判断深度解析2.1 多条件联合判断2.2 类型安全判断 三、模式匹配进阶应用3.1 结构化数据匹配3.2 对象模式匹配 四、判断语句优化策略4.1 逻辑表达式优化4.2 性能对比测试 五、典型应用场景实战…...
Quartus II的IP核调用及仿真测试
目录 第一章 什么是IP核?第二章 什么是LPM?第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL?第一节 设置ALTPLL(嵌入式锁相环)模块参数第二节 仿真 第四章 什么是RAM?第一节 RAM_1PORT的调用第…...
如何修改服务器TTL值
Windows默认返回的TTL值为128,Linux为64,我们怎么修改这个值呢? 目录 一. Windows 二. Linux 临时更改 永久更改 一. Windows WinR输入regedit,打开注册表 路径:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro…...
大模型LLM表格报表分析:markitdown文件转markdown,大模型markdown统计分析
整体流程:用markitdown工具文件转markdown,然后大模型markdown统计分析 markitdown https://github.com/microsoft/markitdown 在线体验:https://huggingface.co/spaces/AlirezaF138/Markitdown 安装: pip install markitdown…...