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.
-
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.
-
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.
-
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.
-
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.
-
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.
-
Offset do obszaru specjalnego (np. dla indeksów B-Tree lub GiST).
-
W tabelach (
heap) zwyklepd_special = 8192(czyli brak tej sekcji).
📌 Użycie:
→ Tylko przy indeksach; pozwala im przechowywać własne metadane.
-
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.
-
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.
| 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?