- 外存管理负责处理数据库与外存介质(PostgreSQL8.4.1版本中只支持磁盘的管理操作)的交互过程。
- 在PostgreSQL中,外存管理由SMGR(主要代码在smgr.c中)提供了对外存的统一接口。
- SMGR负责统管各种介质管理器,会根据上层的请求选择一个具体的介质管理器进行操作。
- 每个表在磁盘中都以一定的结构进行存储,针对磁盘,外存管理模块提供了磁盘管理器和VFD机制。
- 在PostgreSQL8.4.1版本中,还为每个表文件创建了两个附属文件,即空闲空间映射表(FSM)和可见性文件映射表(VM)。
- 另外,对于大数据存储,PostgreSQL也提供了两种处理机制。
表和元组的组织方式
- PostgreSQL中一个表中的元组按照创建顺序依次插入到表文件中。
- 在进行VACUUM操作清除被删除的元组后,元组也可以以无序的方式插入到具有空间空间的文件块中
- 元组之间不进行关联,这样的表文件称为堆文件。
- PostgreSQL系统中包含了四种堆文件:
- 普通堆:堆文件就是普通堆
- 临时堆:临时堆和普通堆结构相同,但是临时堆仅在会话过程中临时创建,会话结束会自动结束。
- 序列:一种特殊的单行表,它是一种元组值自动递增的特殊堆。
- TOAST表:它其实也是一种普通堆,但是它被专门用于存储变长数据。
- 尽管这几种堆的功能各异,但在底层的文件结构却是相似:每个堆文件由多个文件块组成。
文件块在物理磁盘中的存储形式:
PageHeaderData: 24字节长。包含关于页面的一般信息,包括空闲空间指针。
- 结构体:
typedef struct PageHeaderData
{
/* XXX LSN is member of *any* block, not only page-organized ones */
PageXLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog
* record for last change to this page */
uint16 pd_checksum; /* checksum */
uint16 pd_flags; /* flag bits, see below */
LocationIndex pd_lower; /* offset to start of free space */
LocationIndex pd_upper; /* offset to end of free space */
LocationIndex pd_special; /* offset to start of special space */
uint16 pd_pagesize_version;
TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
ItemIdData pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */
} PageHeaderData;
域 | 类型 | 长度 | 描述 |
---|---|---|---|
pd_ |