济南道驰网站建设有限公司怎么样临清网站推广
Tuple含义
- 作用
PG并没有像Oracle那样的undo来存放旧数据,而且PG没有真正意义上的delete,而是将旧版本直接存放于relation文件中,也就是成为了dead tuple。我们可以理解成“过期的数据” - 含义
tuple就相当于一个存储数据的小容器,它包含了两个及以上的components。可能会与Oracle中的row类似,但是这二者之间并不能划等号。 - 结构
 
	 +---------------------+---------------+----------------+| HeapTupleHeaderData |  nulls bitmap | padding        |+------------+--------+---------------+----------------+| object ID  |  value1 value2 value3 ...               |+------------+-----------------------------------------+
 
(1) HeapTupleHeaderData
 (2)nulls bitmap
 这是个可选项,当t_infomask有HEAP_HASNULL标志的话,这个数组就会有值
 (3) padding
 前面null bitmap的长度不确定,为了后面数据能对齐,这里对HeapTupleHeaderData+nulls bitmap 字节对齐,这里会有留空。
 (4) OID值,这是个可选项,当t_infomask有HEAP_HASOID_OLD时,会有此值
 (5)用户数据,就是各列的数据;
Tuple的实践
主要函数为如下五个:
 step1. ExecInsert
 step2. ExecMaterializeSlot
 step3. ExecCopySlotTuple——拼装入口
 step4. heap_form_tuple——根据values和isnull拼装tuple
 step5. heap_fill_tuple——根据desc把数据填到正确的位置
执行器会把tuple包装成tuple table slot来处理,相当于给HeapTuple包装了一层:TupleTableSlots
代码里会见到很多tts = TupleTableSlots,结构如下:
typedef struct TupleTableSlot
{NodeTag		type;bool		tts_isempty;	/* true = slot is empty */bool		tts_shouldFree; /* should pfree tts_tuple? */bool		tts_shouldFreeMin;	/* should pfree tts_mintuple? */bool		tts_slow;		/* saved state for slot_deform_tuple */HeapTuple	tts_tuple;		/* physical tuple, or NULL if virtual */TupleDesc	tts_tupleDescriptor;	/* slot's tuple descriptor */MemoryContext tts_mcxt;		/* slot itself is in this context */Buffer		tts_buffer;		/* tuple's buffer, or InvalidBuffer */int			tts_nvalid;		/* # of valid values in tts_values */Datum	   *tts_values;		/* current per-attribute values */bool	   *tts_isnull;		/* current per-attribute isnull flags */MinimalTuple tts_mintuple;	/* minimal tuple, or NULL if none */HeapTupleData tts_minhdr;	/* workspace for minimal-tuple-only case */long		tts_off;		/* saved state for slot_deform_tuple */
} TupleTableSlot;
 
于普通tuple来说,ExecInsert的第一件事就是“物化”Tuple Slot:
 【slot】 ----组装----> 【materialized slot】
 
