#page-8kb-anatomy
Что лежит внутри страницы 8 КБ? Назови части и куда они растут.
Что отвечать
Страница - единица чтения и записи, по умолчанию 8 КБ. Внутри четыре зоны. Заголовок (`PageHeaderData`, 24 байта): контрольная сумма, LSN последней записи WAL, указатели `pd_lower` и `pd_upper`. Массив указателей строк (line pointers) - растёт от начала вниз. Сами версии строк - кладутся с конца вверх. Особая зона (special space) в конце - для индексов там служебные данные, в heap пустая. Свободное место - это дырка между `pd_lower` и `pd_upper`; когда она схлопывается, в страницу больше ничего не лезет.
Что хотят услышать
Senior должен: - назвать четыре зоны и сказать, что указатели и строки растут навстречу друг другу, а свободное место это зазор между ними - объяснить, зачем нужен слой указателей: строка может двигаться внутри страницы (после очистки), а внешний адрес `(page, item)` остаётся прежним - знать, что 8 КБ это compile-time параметр (`BLCKSZ`), менять его без пересборки нельзя - упомянуть `pageinspect` (`page_header`, `heap_page_items`) как способ посмотреть всё это на живой странице
Подводные камни
- ✗ Сказать «строка лежит по фиксированному смещению» - смещение хранит line pointer, сама строка может переехать
- ✗ Путать свободное место в странице с FSM: FSM это отдельная карта, а дырка `pd_lower..pd_upper` это место в конкретной странице
- ✗ Думать, что 8 КБ можно поменять в конфиге - это параметр сборки `BLCKSZ`, не GUC
Follow-up
- ? Что покажет `SELECT * FROM page_header(get_raw_page('t', 0))`?
- ? Почему `pd_lower` растёт при INSERT, а строки идут с другого конца?
- ? Зачем в странице контрольная сумма и когда она проверяется?
Глубина в базе знаний