首页 > 数据库 >PostgreSQL技术大讲堂 - 第15讲:数据文件与块存储结构

PostgreSQL技术大讲堂 - 第15讲:数据文件与块存储结构

时间:2023-04-28 15:58:16浏览次数:30  
标签:rw PostgreSQL 数据文件 relname base 16384 relfilenode 15

 

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。

Part 15:数据文件与块存储结构

内容1:表的OID与数据文件对应关系

内容2:PostgreSQL数据文件存储方式

内容3:数据文件、空闲空间地图和可见性地图

 

内容4:块空间使用方法

 

对象OID与数据文件对应关系

· PG数据库的一张表或者索引对应一个数据文件。与Oracle集中式的存储方式不同,各有优缺点

· 作为数据库对象的表和索引在内部由各个oid管理,而这些数据文件则由变量relfilenode管理。

· 表和索引的relfilenode值开始时基本上(但并不总是)与相应的oid匹配

sampledb=# SELECT relname, oid, relfilenode FROM pg_class WHERE relname = 'sampletbl';

relname | oid | relfilenode

-----------+-------+-------------

sampletbl | 18740 | 18740

(1 row)

· 相关表的数据文件路径:

$ cd $PGDATA

$ ls -la base/16384/18740

-rw------- 1 postgres postgres 8192 Apr 21 10:21 base/16384/18740

· TRUNCATE、REINDEX、CLUSTER等操作会造成relfilenode号的改变,因为先删除原来的数据文件,再创建一个新的会更快。

sampledb=# SELECT relname, oid, relfilenode FROM pg_class WHERE relname = 'sampletbl';

relname | oid | relfilenode

-----------+-------+-------------

sampletbl | 18740 | 18812

(1 row)

· 使用内置函数pg_relation_file path查看表的文件路径:

sampledb=# SELECT pg_relation_filepath('sampletbl');

pg_relation_filepath

----------------------

base/16384/18812

(1 row)

· 文件尺寸超过1GB后,新文件的产生规则:

$ cd $PGDATA

$ ls -la -h base/16384/19427*

-rw------- 1 data/base/16384/19427

-rw------- 1 data/base/16384/19427.1

 

相关联的其它数据文件

· 空闲空间地图和可见性地图(‘_fsm’和‘_vm’):

$ cd $PGDATA

$ ls -la base/16384/18751*

-rw------- 1 base/16384/18751

-rw------- 1 base/16384/18751_fsm

-rw------- 1 base/16384/18751_vm

· 当insert操作时空闲空间文件用来查看哪些数据块有空闲空间存放新行

· 当进行vacuum操作时可见性地图文件用来提高操作的效率

· 相关的三类文件在内部称为每个关系的分岔(fork);数据文件的fork号为0、空闲空间文件fork号为1,可见性地图文件的fork号为2。

 

数据块内部结构

· 数据文件内部布局

固定长度的页(或块),默认值为8192字节(8kb)

页面的内部布局取决于数据文件类型

· 表中的页包含以下三种数据:

header data -由page header data结构定义的头数据在页面的开头分配。它的长度为24字节,包含有关该页的一般信息。结构的主要变量如下页所述。

line pointer(s) -行指针为4字节长,并保存指向每个堆行的指针。它也被称为项指针。行指针形成一个简单的数组,它起到元组索引的作用。每个索引从1开始按顺序编号,称为偏移量编号。当一个新的行被添加到页面中时,一个新的行指针也被推到数组中以指向新的行

heap tuple(s) -堆元组(行)是记录数据本身。它们从页面底部开始按顺序堆叠。因为PostgreSQL需要同时了解并发控制(CC)和WAL。

 

INSERT操作

· Writing Heap Tuples:

 

UPDATE操作

· 更新一行记录:

update操作时,数据库的操作过程是先delete后insert,被删除的行空间不会立刻释放,vacuum操作时会释放。

 

读操作

· Reading Heap Tuples:

 

以上就是Part 15 - PostgreSQL 数据文件和块存储结构 的内容,欢迎进群一起探讨交流钉钉交流群:35,82,24,60,钉钉群专门有视频讲解

标签:rw,PostgreSQL,数据文件,relname,base,16384,relfilenode,15
From: https://www.cnblogs.com/cnblogs5359/p/17362406.html

相关文章

  • AntDB数据库再获奖,亚信安慧被评为“2022PostgreSQL中国最佳创新企业”
    “中国PostgreSQL数据库生态大会”由中国开源软件推进联盟PostgreSQL分会&中科院软件所&CSDN联合举办,旨在引入更多技术资源、人才资源及校企合作资源,推进PostgreSQL在各行业和区域的推广与应用能力。本次榜单评选表彰了对PostgreSQL中国生态起到重大推动与贡献作用的企业与技术专家......
  • 打卡15
    3.2亲密数 思路很简单,先遍历1-3000,把因子算一下,加一下,然后再算和的质因数和,看是否相等即可,时间复杂度不是很高 流程也很简单#include<bits/stdc++.h>usingnamespacestd;intf(intx)//求一个数的因子和{ intsum=0; for(inti=1;i<=x/2;i++) { if(x%i==0)sum+=i; } re......
  • 【二分查找】LeetCode 153. 寻找旋转排序数组中的最小值
    题目链接153.寻找旋转排序数组中的最小值思路首先分析一下旋转数组可能有的状态:左<中<右,此时最小值肯定在左边,应当收缩右边界左<中,中>右,此时最小值肯定在右半段,应当收缩左边界左>中,中<右,此时最小值肯定在左半段,应当收缩右边界分析这三种状态可以发现,中值小......
  • 每日打卡-15
    一.问题描述该铁路经过N个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第i段铁路连接了城市i和城市i+1(1<=i<N)。如果搭乘的比较远,需要购买多张车票。第i段铁路购买纸质单程票需要Ai博艾元。虽......
  • 解决 Error querying database. Cause: org.postgresql.util.PSQLException: ��������: �û� "p
    最近做数据库作业做得很崩溃,本来就没学过java,结果还要用mybatis+servlet+jsp,,,,,没办法还是得学啊TT遇到个特别无语的报错:###Errorqueryingdatabase. Cause:org.postgresql.util.PSQLException:��������:�û�"postgres"Password��֤ʧ��###Theerrormayexistincom/test/entity/gra......
  • DataX-在Windows上实现postgresql同步数据到mysql
    场景DataX-阿里开源离线同步工具在Windows上实现Sqlserver到Mysql全量同步和增量同步:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130330353在上面实现sqlserver到mysql的数据同步之后,如果要实现postgresql到mysql数据同步流程一样。以PostGis中的OGC元数据......
  • 15.mybatis-plus的QueryWrapper的查询、更新、删除的用法
    1.条件构造查询: 2.主装的查询语句:  3.主装排序的查询语句:   4.删除语句:  5.更新语句的应用:userMapper.update(A,B);QueryWrapperuserWrapper=newQueryWrapper <>();Useruser=newUser();应用:update(user,userWrapper)user:封装的是修改的内容;userWr......
  • 在linux中如何读取使用tcpdump命令抓取保存的tcpdump capture file类型的数据文件
    笔者在之前的文章中,说明了如何在linux使用tcpdump命令进行抓包,以及将抓包结果保存到文件具体操作,可以参考:https://www.cnblogs.com/5201351/p/17357444.html如果是使用tcpdump命令,-wxxxxxx.dump这种方式保存的文件,我们可以通过file命令发现其文件类型[root@localhostqq-52......
  • 对数据库中存储的程序进行现代化改造,以使用 Amazon Aurora PostgreSQL 联合查询、pg_c
    作为数据库迁移和现代化的一部分,您可以继续使用存储的程序和调度作业,将远程实例中的数据整合到集中式数据存储中。 AmazonSchemaConversionTool(AmazonSCT)可帮助您将传统的Oracle和SQLServer函数转换为其等效的开源函数。但是,如何继续使用存储的程序从远程数据库中提取数......
  • PostgreSQL统计信息
    转:PostgreSQL统计信息-阿里云开发者社区(aliyun.com)(96条消息)PG统计信息_pg_stats_三思呐三思的博客-CSDN博客1.数据库统计信息概览2.pg_stat_database关键指标postgres=#select*frompg_stat_databasewheredatname='postgres';-[RECORD1]-----+--------------......