本文主要是介绍postgressql——Tuple学习(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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】
这篇关于postgressql——Tuple学习(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!