본문 바로가기

PostgreSQL

3. PostgreSQL - heap table file layout

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이 별도로 존재하며

자세한 내용은 추후 별도 세션에서 다루는것으로..