block header - stachulemko/doc GitHub Wiki

=

Świetne pytanie – omawiasz teraz nagłówek strony (Page Header) w PostgreSQL, czyli krytyczny kawałek struktury fizycznej, który decyduje o tym, jak PostgreSQL zarządza stroną danych (8 KB).

Przyjrzyjmy się każdemu polu, co znaczy i do czego jest używane w praktyce, np. przy zapisie, aktualizacji, MVCC, vacuum, replikacji i walidacji.


📦 Nagłówek strony (Page Header) — pole po polu


🧾 pd_lsn (8 bajtów) – Log Sequence Number

  • To pozycja w Write-Ahead Logu (WAL), która opisuje ostatnią zmianę tej strony.

  • Dzięki niej replikacja i odzyskiwanie (recovery) wiedzą, czy strona jest aktualna.

  • Stosowane w replikacji i crash recovery.

📌 Użycie:
→ Jeśli serwer padnie i odtworzy WAL, porównuje pd_lsn z logiem — odtwarza tylko, jeśli WAL > pd_lsn.


🔐 pd_checksum (2 bajty) – suma kontrolna

  • Chroni stronę przed uszkodzeniem (bitrot, błędy dysku, RAM, I/O).

  • Obliczana z zawartości strony przy zapisie, sprawdzana przy odczycie.

📌 Użycie:
→ Jeśli suma się nie zgadza, PostgreSQL zgłasza "invalid page checksum" i nie ładuje strony.


🚩 pd_flags (2 bajty) – flagi stanu strony

  • Zawiera różne flagi np. czy strona została poprawnie zainicjowana.

  • Może mieć np. flagę PD_HAS_FREE_LINES, PD_PAGE_FULL, itd.

📌 Użycie:
→ Optymalizuje skanowanie i alokowanie miejsca na stronie — np. jeśli strona ma wolne sloty.


📍 pd_lower (2 bajty) – koniec tablicy slotów (ItemId[])

  • Offset, gdzie kończy się tablica ItemId[] (czyli „slotów”).

  • Tu zaczyna się wolna przestrzeń na nowe wpisy.

📌 Użycie:
→ Gdy wstawiasz nowy wiersz, PostgreSQL sprawdza, czy pd_upper - pd_lower daje wystarczająco miejsca.


📍 pd_upper (2 bajty) – początek danych (tuples)

  • Offset, gdzie zaczynają się fizyczne dane wierszy (rosną od końca strony w górę).

📌 Użycie:
→ Dzięki temu PostgreSQL może alokować dane od końca strony, a ItemId[] od początku.


📍 pd_special (2 bajty) – początek obszaru specjalnego

  • Offset do obszaru specjalnego (np. dla indeksów B-Tree lub GiST).

  • W tabelach (heap) zwykle pd_special = 8192 (czyli brak tej sekcji).

📌 Użycie:
→ Tylko przy indeksach; pozwala im przechowywać własne metadane.


📏 pd_pagesize_version (2 bajty) – rozmiar i wersja

  • Zawiera:

    • Rozmiar strony (np. 8192)

    • Wersję formatu strony

📌 Użycie:
→ Pozwala PostgreSQL-owi sprawdzić, czy strona ma odpowiedni format – zwłaszcza po aktualizacji wersji silnika.


🧹 pd_prune_xid (4 bajty) – XID do czyszczenia (prune)

  • Najmniejszy XID, który może „usunąć” (prune) martwe wersje wierszy.

  • Pomaga zoptymalizować autovacuum i czyszczenie wersji.

📌 Użycie:
→ PostgreSQL wie, czy warto „sprzątać” starą stronę, czy nie – bez sprawdzania każdego wiersza.


📊 Jak PostgreSQL wykorzystuje ten nagłówek?

Operacja Używane pola
WAL / replikacja pd_lsn
Odzyskiwanie danych pd_lsn, pd_checksum
Wstawianie danych pd_lower, pd_upper, pd_flags
VACUUM / pruning pd_prune_xid
Replikacja fizyczna wszystkie
Tworzenie indeksów pd_special, pd_flags
Spójność pd_pagesize_version

Chcesz, żebym rozrysował layout całej strony (8192 bajty) albo pokazał surowe bajty konkretnego bloku z Twojej tabeli?

⚠️ **GitHub.com Fallback** ⚠️