PostgreSQL儲存引擎之heap tuple結構

yzs87發表於2018-11-18

struct HeapTupleHeaderData
{
	union
	{
		HeapTupleFields t_heap;
		DatumTupleFields t_datum;
	}t_choice;
	ItemPointerData t_ctid;//block號及item號
	uint16		t_infomask2;	/* number of attributes + various flags */
	uint16		t_infomask;		/* various flag bits, see below */
	uint8		t_hoff;			/* sizeof header incl. bitmap, padding */
	bits8		t_bits[FLEXIBLE_ARRAY_MEMBER];	/* bitmap of NULLs */
};

欄位說明:

1、t_choice是具有兩個成員的聯合型別:

    t_heap:用於記錄對元組執行插入/刪除操作的事務ID和命令ID,這些資訊主要用於併發控制時檢查元組對事務的可見性。

    t_datum:當一個新元組在記憶體中形成的時候,我們並不關心其事務可見性,因此在t_choice中只需用DatumTupleFields結構來記錄元組的長度等資訊。但在把該元組插入到表檔案時,需要在元組頭資訊中記錄插入該元組的事務和命令ID,故此時會把t_choice所佔用的記憶體轉換為HeapTupleFields結構並填充相應資料後再進行元組的插入。

2、t_ctid用於記錄當前元組或者新元組的物理位置(block號及塊內偏移量),若元組被更新(PostgreSQL對元組的更新採用的是標記刪除舊版本元組並插入新版本元組的方式),則記錄的是新版本元組的物理位置。PostgreSQL中對於元組採用多版本技術儲存,對元組的每個更新操作都會產生一個新版本,版本之間從老到新形成一條版本鏈(將舊版本的t_ctid欄位指向下一個版本的位置即可)。

3、t_infomask2使用其低11位表示當前元組的屬性個數,其他位則用於包括用於HOT技術及元組可見性的標誌位。

4、t_infomask用於標識元組當前的狀態,比如元組是否具有OID、是否有空屬性等,t_infomask的每一位對應不同的狀態,共16種狀態。

5、t_hoff表示該元組頭的大小。

6、_bits[]陣列用於標識該元組哪些欄位為空。

/*
 * information stored in t_infomask:
 */
#define HEAP_HASNULL			0x0001	/* has null attribute(s) */
#define HEAP_HASVARWIDTH		0x0002	/* has variable-width attribute(s) */
#define HEAP_HASEXTERNAL		0x0004	/* has external stored attribute(s) */
#define HEAP_HASOID				0x0008	/* has an object-id field */
#define HEAP_XMAX_KEYSHR_LOCK	0x0010	/* xmax is a key-shared locker */
#define HEAP_COMBOCID			0x0020	/* t_cid is a combo cid */
#define HEAP_XMAX_EXCL_LOCK		0x0040	/* xmax is exclusive locker */
#define HEAP_XMAX_LOCK_ONLY		0x0080	/* xmax, if valid, is only a locker */


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2220463/,如需轉載,請註明出處,否則將追究法律責任。

相關文章