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 |
| xvac | VACUUM 작업용 정보 |
| 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 |