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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: PostgreSQL技术大讲堂 - 第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,钉钉群专门有视频讲解,往期教程联系cuug咨询老师

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版操作报错之往GREENPLUM 6 写数据,用postgresql-42.2.9.jar 报 ON CONFLICT (uuid) DO UPDATE SET 语法有问题。怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
关系型数据库 Linux PostgreSQL
这个错误是因为Flink CDC在尝试访问PostgreSQL的"decoderbufs"文件时,发现该文件不存在
【1月更文挑战第23天】【1月更文挑战第111篇】这个错误是因为Flink CDC在尝试访问PostgreSQL的"decoderbufs"文件时,发现该文件不存在
174 11
|
6月前
|
存储 SQL 人工智能
01-PostgreSQL 存储过程的基本介绍以及入门(基本结构、声明和赋值、控制结构)(下)
01-PostgreSQL 存储过程的基本介绍以及入门(基本结构、声明和赋值、控制结构)
|
5月前
|
消息中间件 Java 关系型数据库
实时计算 Flink版操作报错合集之从 PostgreSQL 读取数据并写入 Kafka 时,遇到 "initial slot snapshot too large" 的错误,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
1012 0
|
5月前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之使用Flink CDC读取PostgreSQL数据时如何指定编码格式
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
101 0
|
3月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
380 0
|
3月前
|
SQL 关系型数据库 HIVE
实时计算 Flink版产品使用问题之如何将PostgreSQL数据实时入库Hive并实现断点续传
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
开发框架 关系型数据库 数据库
在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。
在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。
|
5月前
|
关系型数据库 5G PostgreSQL
postgreSQL 导出数据、导入
postgreSQL 导出数据、导入
55 1
|
5月前
|
自然语言处理 关系型数据库 数据库
技术经验解读:【转】PostgreSQL的FTI(TSearch)与中文全文索引的实践
技术经验解读:【转】PostgreSQL的FTI(TSearch)与中文全文索引的实践
66 0
下一篇
无影云桌面