zoukankan      html  css  js  c++  java
  • PostgreSQL存储页数据结构

    PostgreSQL页存储

    为了节省存储空间,HeapTupleFields和DatumTupleFields在元组头中分享同一个存储结构。但是两个分别是什么?如何实现重叠?何时替换掉?还不是很清楚

    typedef struct HeapTupleFields
    {
    	TransactionId t_xmin;		/* inserting xact ID */
    	TransactionId t_xmax;		/* deleting or locking xact ID */
    
    	union
    	{
    		CommandId	t_cid;	/* inserting or deleting command ID, or both */
    		TransactionId t_xvac;	/* old-style VACUUM FULL xact ID */
    	}t_field3;
    } HeapTupleFields;
    
    typedef struct DatumTupleFields
    {
    	int32		datum_len_;	/* varlena header (do not touch directly!) */
    
    	int32		datum_typmod;	/* -1, or identifier of a record type */
    
    	Oid		datum_typeid;	/* composite type OID, or RECORDOID */
    
    	/*
    	 * Note: field ordering is chosen with thought that Oid might someday
    	 * widen to 64 bits.
    	 */
    } DatumTupleFields;
    
    struct HeapTupleHeaderData
    {
    	union
    	{
    		HeapTupleFields t_heap;
    		DatumTupleFields t_datum;
    	}t_choice;
    
    	ItemPointerData t_ctid;		/* 指向当前元组的最新位置的偏移量和长度 */
    	uint16		t_infomask2;	/* number of attributes + various flags */
    	uint16		t_infomask;		/* various flag bits, see below */
    
    	uint8		t_hoff;			/* sizeof header incl. bitmap, padding */
    
    	/* ^ - 23 bytes - ^ */
    
    	bits8		t_bits[FLEXIBLE_ARRAY_MEMBER];	/* bitmap of NULLs */
    
    	/* MORE DATA FOLLOWS AT END OF STRUCT */
    };
    
    

    其中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 */
    
    #define HEAP_XMIN_COMMITTED	0x0100	/* t_xmin committed */
    #define HEAP_XMIN_INVALID	0x0200	/* t_xmin invalid/aborted */
    #define HEAP_XMAX_COMMITTED	0x0400	/* t_xmax committed */
    #define HEAP_XMAX_INVALID	0x0800	/* t_xmax invalid/aborted */
    
    #define HEAP_XMAX_IS_MULTI	0x1000	/* t_xmax is a MultiXactId */
    #define HEAP_UPDATED		0x2000	/* this is UPDATEd version of row */
    #define HEAP_MOVED_OFF		0x4000	/* moved to another place by pre-9.0 VACUUM FULL; kept for binary upgrade support */
    #define HEAP_MOVED_IN		0x8000	/* moved from another place by pre-9.0 VACUUM FULL; kept for binary upgrade support */
    
    #define HEAP_XMAX_SHR_LOCK    (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)
    #define HEAP_LOCK_MASK        (HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)
    
    #define HEAP_XMIN_FROZEN        (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)
    #define HEAP_MOVED             (HEAP_MOVED_OFF | HEAP_MOVED_IN)
    
    #define HEAP_XMAX_IS_LOCKED_ONLY(infomask) 
    	(((infomask) & HEAP_XMAX_LOCK_ONLY) || 
    	 (((infomask) & (HEAP_XMAX_IS_MULTI | HEAP_LOCK_MASK)) == HEAP_XMAX_EXCL_LOCK))
    
    
    /*
     * information stored in t_infomask2:
     */
    #define HEAP_NATTS_MASK			0x07FF	/* 11 bits for number of attributes */
    /* bits 0x1800 are available */
    #define HEAP_KEYS_UPDATED		0x2000	/* tuple was updated and key cols
    										 * modified, or tuple deleted */
    #define HEAP_HOT_UPDATED		0x4000	/* tuple was HOT-updated */
    #define HEAP_ONLY_TUPLE			0x8000	/* this is heap-only tuple */
    
    #define HEAP2_XACT_MASK			0xE000	/* visibility-related bits */
    
  • 相关阅读:
    性能02篇-性能测试工具介绍
    网关协议:CGI和WSGI
    Spring Cloud与微服务构建:Spring Cloud简介
    前端基础:HTTP 状态码详解
    Spring Cloud与微服务构建:微服务简介
    Redis 基础:Redis 事件处理
    Redis 基础:Redis 数据类型
    Redis 基础:Redis 配置
    Django 2.0 学习(22):Django CSRF
    Django 2.0 学习(21):Django Session
  • 原文地址:https://www.cnblogs.com/bingo711x/p/6545004.html
Copyright © 2011-2022 走看看