关注我们,获得更多资源
作者 | 李亮,云和恩墨西区交付工程师,长期服务于运营商、社保、银行、医院、公积金等行业,擅长数据库备份恢复,升级迁移,性能优化,sql优化。
导读:PostgreSQL 号称是“世界上最先进的开源数据库”(The world's most advanced open source database),在DB-Engines的排名中长期处于第四的位置,并且增长趋势明显。开源的优势就是可以直接阅读源码,本文通过源码结合pageinspect对pg的page结构进行解析和学习。
一、Page
pg中的page和Oracle中的数据块一样,指的是数据库的块,操作系统块的整数倍个,默认是8K也就是两个操作系统块(4k的文件系统块)。这个大小在pg编译安装configure的时候通过--with-blocksize参数指定,单位是Kb。
二、Page的内部结构
2.1 page结构
2.2 PageHeaderData数据结构 (页头)
可以看到一个Page有 Pager header(页头),后面是linp(行指针),pd_lower和pd_upper分别是空闲空间的开始位置和结束位置;后面就是行数据(pg里面的行就是tuple)和special空间。整个page的结构比Oracle的数据块结构简单多了。
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;
具体的长度和描述也都有详细说明:
Field |
Type |
Length |
Description |
pd_lsn |
PageXLogRecPtr |
8 bytes |
LSN: next byte after last byte of WAL record for last change to this page |
pd_checksum |
uint16 |
2 bytes |
Page checksum |
pd_flags |
uint16 |
2 bytes |
Flag bits |
pd_lower |
LocationIndex |
2 bytes |
Offset to start of free space |
pd_upper |