PostgreSQL을의 구문 분석 삽입

어떤 함수 삽입입니다 heapam_tuple_insert 완료.

1, 제 요구 튜플 값 슬롯에서 제거 될, HeapTupleTableSlot.tuple

2 OID 삽입되는 기록 테이블로부터 얻어진 관계 : 관계 -> 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) -> 0 t_choice.t_heap.t_xmax 为

트랜잭션 ID를 삽입하는이 xMin 것을, 0 XMAX

  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