海山数据库(He3DB)源码详解:海山PG 表和元组的组织方式(1)
一、概述
PostgreSQL
是一种开源的关系型数据库管理系统,具有强大的功能和可靠性。在PostgreSQL
数据库中,表和元组是数据组织的基础单元。其中,表是PG数据库中存储数据的逻辑结构,由多个列(Column
)和行(Row
)组成。列代表了数据字段,而行则代表了一条条的数据记录。每个表都有其独特的属性,如主键(Primary Key
)、外键(Foreign Key
)、索引(Index
)等。主键用于唯一标识表中的一条记录,外键用于建立表与表之间的关联,索引则用于提高查询效率。在PostgreSQL中,元组通常指的是表中的一行数据,即一条记录。元组包含了该记录在表中所有字段的值,这些字段值对应于表中的列。每个字段值都有其特定的数据类型,如整数、浮点数、字符串等。在物理存储上,元组被存储在表文件的页(Page
)中。每个页包含了多个元组,并且这些元组按照创建顺序或特定的存储策略被组织在一起。
在PostgreSQL
中,一个表中的元组按照创建顺序依次插入到表文件中。这样的表文件即堆文件,按照功能可分为四类。而其中的元组数据信息主要通过设计的元组头部信息来进行多版本并发控制、数据可见性判断等操作。
二、表和元组的组织方式
PostgreSQL
中的表和元组通过特定的组织方式来提高存储效率和查询性能。
1、堆文件组织:
PostgreSQL
使用堆文件(Heap File
)来存储表数据。堆文件是一种无序的数据存储结构,其中的元组按照创建顺序或VACUUM
操作后的空闲空间顺序被插入。- 堆文件由多个页组成,每个页包含了多个元组。页的大小通常是固定的(如8KB),并且页内元组的存储顺序是连续的。
为了管理页内的空闲空间,PostgreSQL
为每个页维护了一个页头(Page Header
),其中包含了关于页的一般信息,如空闲空间指针、特殊空间指针等。
2、行指针和索引:
- 在堆文件中,每个元组都通过行指针(
Item Pointer
)来定位。行指针包含了元组在页内的偏移量和长度信息,使得系统能够快速找到并访问元组。 - 为了提高查询效率,
PostgreSQL
还支持索引机制。索引是一种特殊的数据结构,用于存储表中元组的键值对,并允许系统根据键值快速定位元组。
3、存储管理:
- PostgreSQL的存储管理由SMGR(
Storage Manager
)提供统一接口。SMGR
负责处理表的物理存储,包括文件的创建、读取、写入和删除等操作。 - 为了优化存储性能,
PostgreSQL
还采用了空闲空间映射表(FSM
)和可见性文件映射表(VM
)等机制来管理页内的空闲空间和元组的可见性。