# Page Structure A **Page** (or Block) is the fundamental unit of storage in PostgreSQL. By default, pages are **8KB** in size and are the unit of I/O between the disk and the shared buffer cache. For the narrative explanation of this concept, see [[Chapter 1/1.3 - The Shipping Container (The Page)|1.2 The Page (The Shipping Container)]]. ## Page Layout Each 8KB page is aligned to 8-byte boundaries and consists of the following regions: 1. **Page Header (24 bytes)**: Contains metadata such as: - `pd_lsn`: Log Sequence Number (LSN) of the last WAL record that modified this page. - `pd_checksum`: CRC checksum for integrity verification. - `pd_lower`: Offset to the start of free space. - `pd_upper`: Offset to the end of free space. - `pd_special`: Offset to the start of the special space region. 2. **Item Identifiers (Linp)**: An array of 4-byte `ItemIdData` pointing to the actual tuples. 3. **Free Space**: The unallocated gap between item identifiers and tuples. 4. **Items (Tuples)**: The actual data tuples, stored from the end of the page upward. 5. **Special Space**: Optional region at the end of the page used by index access methods (e.g., for B-Tree sibling pointers). ## Internal Mechanisms - **Fillfactor**: A storage parameter that determines the percentage of a page to be filled during initial INSERTs, leaving space for future UPDATEs to minimize fragmentation. - **FSM (Free Space Map)**: A separate fork that tracks the amount of free space in each page to speed up the search for insertion targets. - **VM (Visibility Map)**: A separate fork that tracks which pages contain only tuples visible to all transactions, optimizing VACUUM and index-only scans. ## See Also - [[Structures/Tuple|Tuple Structure]] - [[Structures/Table|Table Access Methods]] - [[Architecture/WAL|Write-Ahead Logging]]