作者简介
刘阳明,数据库研发工程师,对数据库内核有浓厚兴趣;看好PostgreSQL的前景,希望有PostgreSQL被更多的人深入了解。
一、总体结构
PostgreSQL的堆表由多个页组成。业内结构如上图所示(代码readme中),由5部分构成,如下。
模块 |
描述 |
页头 |
24字节长,包含页内的总体信息与空闲空间的位置。 |
行指针 |
每个行指针占4个字节,由两项信息构成(offset,length) ,指向实际的Tuple数据。 |
空闲空间 |
页内未分配的空间,如果FreeSpace剩下的空间放不下一个元组,那么该页就是满了。新的行指针从空闲空间的头部开始分配,相应的Tuple数据从空闲空间的尾部开始分配。 |
Tuple |
实际的Tuple数据 |
特殊空间 |
如果是索引页,那么根据索引类型的不同存储的数据也不同。 |
Page Header
• LSN:在BufferManager中,为了保证WAL的原则(thou shalt write xlog before data),对每个块标记了一个日志序列号(Log Sequence Number)。
• prune xid:PostgreSQL中有一个对页内空间进行整理的过程,该列记录了上一个对页进行整理的xid。