heap table, index, free space map 그리고 visibility map은 모두 data file임.
data file을 다시 작게 쪼개보면 8KB(8192 bytes - default)의 page(=block)로 구성되어 있음.
각 data file 내부의 pages에는 block number가 있고 0부터 시작하고 page에 공간이 없으면 새 page를 추가함.
page의 내부 layout은 data file type에 따라 달라짐.
여기서는 heap table layout만 설명함.
heap table layout

| heap tuple(s) record data로 page의 바닥에서부터 순서대로 쌓이며 tuple의 내부구조는 아래와 같음. tuple internal은 추후 MVCC(Multi-Version Concurrency Control)과 WAL(Write Ahead Logging)에서 또 다루게 되니 간단하게 구조만 보자. ![]() line pointer(s) - 4bytes item pointer라고도 불리며 각 heap tuple을 가리키는 pointer역할을 함. 즉, page에 새로운 tuple이 추가되면 새로 추가된 tuple을 가리키는 line pointer도 simple arrary에 추가됨. 각 index는 1부터 순차적으로 번호가 매겨지며 offset number라고 함. free space(hole) line pointer의 끝부분과 최신 tuple의 시작 부분의 사이의 빈공간을 의미함. header data - 24bytes PageHeaderData structure로 정의된 header data는 page의 시작부분에 할당됨. 소스 코드에서 구조체로 확인할 수 있고 맴버 변수 중 5가지만 정리 pd_lsn - 8bytes 해당 page에서 마지막 변경으로 작성된 XLOG record의 LSN을 저장함. WAL 메카니즘과 관련있음. pd_checksum 해당 page의 checksum 값을 저장 pd_lower, pd_upper pd_lower는 line pointer의 마지막 값을 가리킴 pd_upper는 최신 tuple의 시작 값을 가리킴 pd_special index data file의 page에서는 special space의 시작값을 가리키며 index에서만 보유하는 데이터 영역임. indexes를 위한 것으로 B-tree, GiST, GiN 등 인덱스 type에 따라 특정 데이터를 포함하는 영역임. table data file의 page에서는 page 끝을 가리킴. |
TID (Tuple IDentifier)
table 내 tuple을 식별하기 위해 사용
TID는 하나의 쌍으로 구성되며 아래와 같다
TID = (tuple을 포함하는 page의 block number, tuple을 가리키는 line pointer의 offset number)

TOAST(The OverSized-Attribute Storage Technique)
heap tuple의 size가 2KB(8KB/4)보다 크면 TOAST라고 불리는 method를 사용해 저장되고 관리됨.
TOAST로 관리될 수 있는 data type이 별도로 존재하며
자세한 내용은 추후 별도 세션에서 다루는것으로..
'PostgreSQL' 카테고리의 다른 글
| 06. PostgreSQL - MVCC 개념 (4) | 2024.12.17 |
|---|---|
| 04. PostgreSQL - tuple을 읽고 쓰는 방법 (4) | 2024.12.15 |
| 0. postgreSQL internal (1) | 2024.12.15 |
| 2. PostgreSQL internal - physical structure (6) | 2024.12.15 |
| 1. PostgreSQL internal - logical structure (2) | 2024.12.15 |
