PostgreSQL源码学习(1)Page页

database

The Internals of PostgreSQL中对于存储的描述http://www.interdb.jp/pg/pgsql01.html#_1.2.

每个表或索引都作为一个page数组存储于物理数据文件中(page大小默认为8k,编译时可以指定),单个的表数据文件中包含多个page页(默认单个表文件最大1G,超过1G后会新建同名+“.1”后缀的数据文件,依次累加,同样在编译时可以指定单个文件的最大值)。page页的结构如下图所示。

而对于page页中存储的行数据Tuple,其结构为下图所示。

相关数据结构

// src/include/storage/bufpage.h

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;

// src/include/storage/itemid.h

typedef struct ItemIdData

{

unsigned lp_off:15, /* offset to tuple (from start of page) */

lp_flags:2, /* state of line pointer, see below */

lp_len:15; /* byte length of tuple */

} ItemIdData;

/*

* lp_flags has these possible states. An UNUSED line pointer is available

* for immediate re-use, the other states are not.

*/

#define LP_UNUSED 0 /* unused (should always have lp_len=0) */

#define LP_NORMAL 1 /* used (should always have lp_len>0) */

#define LP_REDIRECT 2 /* HOT redirect (should have lp_len=0) */

#define LP_DEAD 3 /* dead, may or may not have storage */

// src/include/access/htup_details.h

struct HeapTupleHeaderData

{

union

{

HeapTupleFields t_heap;

DatumTupleFields t_datum;

} t_choice;

ItemPointerData t_ctid; /* current TID of this or newer tuple (or a

* speculative insertion token) */

/* Fields below here must match MinimalTupleData! */

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2 2

uint16 t_infomask2; /* number of attributes + various flags */

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK 3

uint16 t_infomask; /* various flag bits, see below */

#define FIELDNO_HEAPTUPLEHEADERDATA_HOFF 4

uint8 t_hoff; /* sizeof header incl. bitmap, padding */

/* ^ - 23 bytes - ^ */

#define FIELDNO_HEAPTUPLEHEADERDATA_BITS 5

bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]; /* bitmap of NULLs */

/* MORE DATA FOLLOWS AT END OF STRUCT */

};

// src/include/access/htup.h

typedef struct HeapTupleData

{

uint32 t_len; /* length of *t_data */

ItemPointerData t_self; /* SelfItemPointer */

Oid t_tableOid; /* table the tuple came from */

#define FIELDNO_HEAPTUPLEDATA_DATA 3

HeapTupleHeader t_data; /* -> tuple header and data */

} HeapTupleData;

以上是 PostgreSQL源码学习(1)Page页 的全部内容, 来源链接: utcz.com/z/533062.html

回到顶部