PostgreSQL

PostgreSQL: Heap Table Structure

dewstream 2025. 11. 5. 08:00
728x90

※ PostgreSQL: Heap Table Structure.
 
안녕하세요. 듀스트림입니다.
 
오늘은 또 슥 한 번 읽어두면 좋은 내용인 PostgreSQL의 기본 저장 구조인 힙 테이블에 대한 내용입니다.


PostgreSQL의 힙(Heap) 테이블은 PostgreSQL의 기본 저장 구조입니다.

힙 테이블은 인덱스 없이 순서 없이 데이터를 저장하며,
PostgreSQL의 MVCC 구현에 매우 밀접하게 관련되어 있습니다.

1. 힙 테이블의 계층 구조

대충 이렇게 생겼습니다.

Table (Relation)
└── Data File (heap)
    └── Page (Block, 8KB)
        └── Line Pointer (Item Identifier)
            └── Tuple (Row)

2. Data File → Page (Block) 구조

  • PostgreSQL은 테이블 데이터를 8KB의 고정 크기 페이지 단위로 관리합니다.

▸ 페이지 영역 구조

| Page Header | Line Pointer Array | Free Space | Tuples (Data) |

 

  • Page Header (24 byte 이상)
    • 해당 페이지에 대한 메타정보가 담깁니다:
      • pd_lsn: WAL 로그 시점
      • pd_checksum: 페이지 체크섬
      • pd_flags, pd_lower, pd_upper, pd_special: 내부 포인터
  • Line Pointer Array (ItemIdData[ ])
    • 페이지 내에 존재하는 튜플에 대한 포인터 목록
    • 각 포인터는 튜플의 위치와 상태(정상, 삭제됨 등)를 가리킴

3. Tuple Header 구조

  • 튜플은 메모리상 HeapTupleHeaderData 구조체로 표현되며, 실제 데이터뿐 아니라 MVCC를 위한 메타데이터도 포함됩니다.
| Tuple Header | NULL Bitmap | Padding | Actual Data |

 
▸ Tuple Header 주요 필드

필드명설명
xmin이 튜플을 생성한 트랜잭션 ID
xmax이 튜플을 삭제한 트랜잭션 ID
xvacVACUUM 작업용 정보
ctid튜플의 물리적 위치 (TID: block번호 + offset)
infomask, infomask2힌트 비트 및 상태 정보
t_bits[]NULL 여부 비트맵 (NULL bitmap)
※ MVCC에서 트랜잭션 가시성 판단은 xmin, xmax를 기준으로 이루어집니다.

4. DML 시 동작

4.1 INSERT

  • 새로운 블록 또는 빈 공간에 Tuple 생성
    • xmin = 현재 트랜잭션 ID
    • xmax = NULL

4.2 DELETE

  • 기존 Tuple의 xmax에 삭제한 트랜잭션 ID 기록
  • Tuple은 실제 삭제되지 않고 "죽은 튜플(dead tuple)" 상태

4.3 UPDATE

  • 기존 Tuple은 xmax가 설정되어 비가시성 처리
  • 새로운 Tuple이 다른 위치에 생성 (ctid는 원래 Tuple을 가리킴)
※ ctid는 PostgreSQL의 각 행(Row)에 대해 자동으로 부여되는 물리적 위치 식별자입니다.

5. MVCC와 힙 테이블의 관계

PostgreSQL의 MVCC는 Tuple 복제 + 트랜잭션 ID 기반으로 동작합니다.
덕분에 Lock 없이 동시성 제어가 가능하지만, 다음과 같은 부작용도 있습니다:

  • Dead tuple이 쌓임 → VACUUM 또는 HOT pruning 필요
  • heap_page_prune() → 같은 페이지 내 dead tuple 정리

6. 다이어그램

[Table (Relation)]
 └── heap1 (data file)
     ├── Page 1
     │    ├── Line Ptr 1 → Tuple 1
     │    ├── Line Ptr 2 → Tuple 2 (dead)
     │    └── Line Ptr 3 → Tuple 3
     └── Page 2
          └── ...

66.6. Database Page Layout

66.6. Database Page Layout # 66.6.1. Table Row Layout This section provides an overview of the page format used within PostgreSQL …

www.postgresql.org

 

postgres/src/backend/access/heap/heapam.c at master · postgres/postgres

Mirror of the official PostgreSQL GIT repository. Note that this is just a *mirror* - we don't work with pull requests on github. To contribute, please see https://wiki.postgresql.org/wiki/Subm...

github.com


오늘은 여기까지~
 

728x90

'PostgreSQL' 카테고리의 다른 글

PostgreSQL: never executed  (0) 2025.11.10
PostgreSQL: ctid  (0) 2025.11.07
PostgreSQL: Heap Fetch  (0) 2025.11.03
PostgreSQL: ALTER TABLE ...  (0) 2025.10.31
PostgreSQL: 캐시 히트  (0) 2025.10.29