Вопрос или проблема
Я разобрался, как конструкция дерева FSM устроена на низком уровне (внутри одной страницы), но не знаю, как работают разные страницы вместе (я прочитал всю информацию, которую смог найти в сети, включая README Postgres).
У нас есть только страница для fsm с данными в виде двоичного дерева:
54
23 54
12 23 54 60
Где 12, 23, 54, 60 – это категории 1, 2, 3, 4 страницы соответственно.
Для простоты предположим, что одна страница FSM может хранить только 4 листовых узла.
Как мы будем вставлять в это дерево информацию о следующей странице (5-й странице)
Я пробовал разные варианты, чтобы разобраться с этим самостоятельно, но это выглядит странно и, предположительно, не может быть реальностью.
Ответ или решение
Свободная схема памяти (Free Space Map, FSM) в PostgreSQL — это важный аспект управления памятью, который помогает отслеживать свободное пространство в таблицах и индексах. Давайте подробно рассмотрим, как работает FSM на разных страницах, и как осуществляется вставка новых данных в структуру дерева.
Структура Free Space Map в PostgreSQL
FSM — это структура данных, находящаяся на страницах базы данных PostgreSQL, которая хранит информацию о свободном месте для вставки строк. Каждый раз, когда происходит вставка строки в таблицу, PostgreSQL обращается к FSM, чтобы определить, какая страница содержит достаточно свободного места для данной операции.
FSM организован как дерево, где каждая страница может хранить информацию о других страницах. Например, если у вас имеется следующая информация о страницах:
- Листовые узлы: 12, 23, 54, 60 — это страницы, представляющие свободные пространства для различных классов данных.
- Внутренние узлы: 54 (родительский узел) и 23 (левый дочерний узел) образуют бинарное дерево.
В вашей ситуации, каждая страница FSM хранит информацию о свободном пространстве для определённого диапазона страниц, а каждая страница может содержать максимум 4 листовых узла.
Вставка в дерево Free Space Map
Когда вы добавляете информацию о следующей странице (пятой странице) в уже существующее дерево, необходимо учитывать структуру и ограничения FSM. В этом случае у вас всего 4 листовых узла, и чтобы вставить 5-ю страницу, необходимо выполнить следующее:
-
Проверить наличие достаточно места: Для начала, необходимо убедиться, что количество листовых узлов не превышает максимальную емкость страницы. Ваша текущая структура имеет 4 узла (12, 23, 54, 60), что соответствует полной странице.
-
Разделение страниц (splitting): Когда новые данные (например, страница 30) добавляются в FSM и текущая страница уже заполнена, требуется выполнить операцию деления. Это деление будет приводить к созданию новой страницы (например, страницы FSM_2), где будет храниться информация (например, страница 30).
-
Обновление родительских узлов: После добавления новой страницы, необходимо будет обновить родительский узел (например, 54), чтобы он указывал на новую страницу FSM_2, а также к существующим страницам. Если потребуется, структура может быть скорректирована для дополнительной балансировки.
-
Перенос значений: Листовые узлы на старой странице можно распределить на обе страницы, если это необходимо, с учётом их значений. Например, при добавлении 30, вы можете изменить структуру так, чтобы 12 и 23 остались на первой странице, а 30 и 54 оказались на второй.
Пример
Если вы решите добавить новую страницу (номер 30):
-
Текущая FSM:
- Страница 1: [12, 23, 54, 60]
-
Проверка на количество узлов:
- 4 узла (заполнена).
-
При добавлении 30:
- Делите FSM на две страницы.
- Страница 1: [12, 23]
- Страница 2: [30, 54, 60]
-
Обновление дерева:
- Обновите родительский узел для включения новой информации.
Заключение
Таким образом, структура Free Space Map в PostgreSQL предоставляет мощный механизм для управления свободным пространством на страницах. Каждая операция вставки требует бережного подхода и, в случае необходимости, деления страниц для поддержания эффективной и производительной работы СУБД. Понимание этой динамики позволяет оптимизировать операции вставки и, в целом, управление памятью в PostgreSQL.