Детали карты свободного пространства в Postgresql

Вопрос или проблема

Я разобрался, как конструкция дерева 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-ю страницу, необходимо выполнить следующее:

  1. Проверить наличие достаточно места: Для начала, необходимо убедиться, что количество листовых узлов не превышает максимальную емкость страницы. Ваша текущая структура имеет 4 узла (12, 23, 54, 60), что соответствует полной странице.

  2. Разделение страниц (splitting): Когда новые данные (например, страница 30) добавляются в FSM и текущая страница уже заполнена, требуется выполнить операцию деления. Это деление будет приводить к созданию новой страницы (например, страницы FSM_2), где будет храниться информация (например, страница 30).

  3. Обновление родительских узлов: После добавления новой страницы, необходимо будет обновить родительский узел (например, 54), чтобы он указывал на новую страницу FSM_2, а также к существующим страницам. Если потребуется, структура может быть скорректирована для дополнительной балансировки.

  4. Перенос значений: Листовые узлы на старой странице можно распределить на обе страницы, если это необходимо, с учётом их значений. Например, при добавлении 30, вы можете изменить структуру так, чтобы 12 и 23 остались на первой странице, а 30 и 54 оказались на второй.

Пример

Если вы решите добавить новую страницу (номер 30):

  1. Текущая FSM:

    • Страница 1: [12, 23, 54, 60]
  2. Проверка на количество узлов:

    • 4 узла (заполнена).
  3. При добавлении 30:

    • Делите FSM на две страницы.
    • Страница 1: [12, 23]
    • Страница 2: [30, 54, 60]
  4. Обновление дерева:

    • Обновите родительский узел для включения новой информации.

Заключение

Таким образом, структура Free Space Map в PostgreSQL предоставляет мощный механизм для управления свободным пространством на страницах. Каждая операция вставки требует бережного подхода и, в случае необходимости, деления страниц для поддержания эффективной и производительной работы СУБД. Понимание этой динамики позволяет оптимизировать операции вставки и, в целом, управление памятью в PostgreSQL.

Оцените материал
Добавить комментарий

Капча загружается...