Как btree хранится на диске?

Я знаю, как реализовать btree в памяти, но не ясно, как хранить btree на диске. Я думаю, что есть два основных отличия:

  • Конверсия между указателем памяти и адресом диска см. в этом post.
  • Как разбить страницу при вставке нового элемента k/v? Его очень легко реализовать в памяти.

Спасибо

Ответы

Ответ 1

все зависит от используемой вами СУБД. Если вы хотите знать, как это реализовано в MS SQL Server, все, что нужно прочитать:

  • Страницы (я думаю, они находятся практически во всех современных СУБД) - в SQL Server они составляют 8 КБ. Файл базы данных состоит из страниц.
  • Экстенты - логические группы из 8 непрерывных страниц
  • (S) GAM - (общая) Глобальная карта распределения. Растровое изображение, содержащее информацию о свободных и занятых экстентах. Это одна из первых страниц в файле базы данных.
  • IAM - Карта распределения индексов. Вы можете узнать, какой индекс/куча хранится в пределах экстентов. Имея эту информацию, вы можете получить место в файле, где хранится индекс/куча.

Используя IAM и GAM (или SGAM), вы можете разделить страницу - просто переместите часть страницы (которая должна быть переполнена) на другую страницу в файле.

IAM и GAM также отвечают на ваш первый вопрос.

Большинство этих имен берутся из MS SQL Server, но я уверен, что в других СУБД решается довольно похоже.

Надеюсь, что это поможет.

Ответ 2

Моя рекомендация - взглянуть на книгу Внедрение системы баз данных

Глава 2 "Хранилище данных" и глава 3, "представляющие элементы данных", дадут вам несколько советов по этой проблеме.

Структуры индексов главы 4 имеют раздел о Btrees

Это лучший источник информации, который я нашел до сих пор на эту тему.