PostgreSQLのの解析挿入

これは、関数の挿入であるheapam_tuple_insert完成。

1、タプル値のスロットから除去された最初のニーズ、HeapTupleTableSlot.tuple

2、OID挿入される記録テーブルから得られた関係:relation-> rd_id、及びスロット - > tts_tableOidとtuple-> t_tableOid更新OID用

3、タプルはヒープのページを挿入heap_insertを呼び出して、このプロセスは、WALバッファに書き込みWALログを生成します。

  1)トランザクションIDを生成する:XID

  2)関数を呼び出すheap_prepare_insert:設定tup-> T_DATA t_infomaskとt_infomask2; tup-> t_data-> t_choice.t_heap.t_xmin XIDの。

(tup-> T_DATA) - > t_choice.t_heap.t_field3.t_cid为入参CID

(tup-> T_DATA) - > t_choice.t_heap.t_xmax为0

トランザクションIDを挿入することがxmin、xmaxは0

  3)メモリにロードされ、データ・ページとデータページを満たすためにスペースを見つけるFSMからRelationGetBufferForTupleを呼び出し、ブロック番号は、バッファメモリブロックを返します

  4)CheckForSerializableConflictIn分離レベルの処理

  最後のページから5)のコールRelationPutHeapTupleと空きスロットにレコードを挿入します。空きスロットを見つけるために、どのように、完全なPageAddItemExtended。

  6)この時間pd_flags&PD_ALL_VISIBLEでページ、すなわち、可視ページ内のすべてのレコードが、レコードが挿入されている今回場合、ラベルはクリアされる必要があります。

  7)バッファは、その後のブラシ汚れたチェックポイントのために、ダーティ・ページをマークされています

  8)生成WAL日志,并将WAL日志写入WAL BUFFER

  9)将此时lsn写入页头pd_lsn

4、更新tuple->t_self为slot->tts_tid,即记录在页内位置。

如何在页内找一个free slot由函数PageAddItemExtended完成。

1、计算出pd_linp数组的最大值后新增一个后的个数:

limit=[pg_lower-sizeof(PageHeader)]/Sizeof(ItemIdData)+1

2、如果页头中pd_flags & PD_HAS_FREE_LINES为TRUE,即该数组中有free slot,那么首先从这个数组中找一个可用的ItemIdData,从pd_linp[0]开始一个一个的进行判断,一旦(itemId)->lp_flags == LP_UNUSED && (itemId)->lp_len != 0,表明这个slot可用,那么取这个offsetNumber返回

3、如果该页中没有free slot,则在pd_linp[limit-1]当前最后一个ItemIdData后面添加一个ItemIdData,设置该ItemIdData的值将其lp_off指向pd_upper位置并调整其lp_len=tuple->t_len,lp_flags = LP_NORMAL

 

发布了289 篇原创文章 · 获赞 85 · 访问量 26万+

おすすめ

転載: blog.csdn.net/yanzongshuai/article/details/104486903