1、物理段与文件页概念
PostgreSQL中,一个表对应一个逻辑文件,一个表被分割成若干个物理段文件(relation segment),除最后一段外默认大小40M。
文件页(磁盘块)是物理段文件的基本储存单位,也是内存和磁盘交换的单位。文件页大小限制了表元组的大小并影响磁盘操作效率,缺省大小8192字节,最大可设置为2^15字节(这是由磁盘块索引是15位决定的)。
2、文件页(磁盘块)详细描述
一个文件页空间被逻辑分割为三个部分:
- PageHeader:页描述区 记载页的使用情况, 如页分布格式版本,元组数据空间和特殊空间的起始位置以及文件页相关的事务日志记载点等信息
- Tuple Item space:元组数据空间 实际记录元组数据的地方
- Special space:特殊空间
每个记录的元组(Tuple)称为一项,每项由描述ID和元组数据构成。项描述ID描述了元组存储位置,大小以及一些状态标识。项描述ID和项数据分别在元组数据空间的两头往中间存放,最早的项存在最两侧,越晚的数据越靠中间。
元组的写过程:先写到文件页的内存缓冲区(Buffer),再更新到磁盘中
- 从缓冲页的元组数据存储区分配空间
- 构造元组描述ID,写入低端处
- 把实际数据写到高端处,并设置缓冲区的脏标记
- 更新到磁盘
- 写元组不会立即更新到磁盘,而是推迟到所在的缓冲区被替换(Replace)时进行
- Replace时,判断缓冲区是否脏:
- 如果脏,启动实际磁盘IO进行写;
- 如果不脏,直接回收再用该Buffer。
文件页的写过程:
- 先更新该文件页的事务日志,事务日志由页头部的页描述符指出
- 把文件缓冲页写到指定磁盘块
原文链接:https://www.jianshu.com/p/04b542aeebac