Как типичная СУБД хранит и находит блоки?

#database #io #rdbms

#База данных #io #СУБД

Вопрос:

Я понимаю, что блок является фундаментальным физическим элементом FS и СУБД. Как система управления реляционными базами данных, такая как MySQL или Oracle, хранит данные своих блоков, а затем загружает их в память? Использует ли она файловую систему? Метод поиска? Или просто голый ввод-вывод, как файловая система?

Я везде искал ответ и не нашел ответа, хотя я уверен, что блочное хранилище — это то, о чем многие должны знать, глядя на количество реализаций.

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: просто чтобы уточнить, я хочу знать, как СУБД фактически реализует этот блок в хранилище. Использует ли она кластеры файловой системы или вообще обходит FS?

Ответ №1:

Я ничего не знаю о том, как MySQL и Oracle хранят данные, однако я могу дать некоторое представление о том, как работает Microsoft SQL Server

В SQL Server основной единицей хранения является страница размером 8 КБ. Все хранится в виде блоков размером со страницу, и почти вся память также организована и распределена в этих блоках размером 8 КБ. Например, все следующее хранится в pages:

  • Данные в таблицах
  • Индексы
  • Планы выполнения

Всякий раз, когда используется страница, ее необходимо загружать в память и сохранять загруженной до тех пор, пока SQL Server не закончит работу с этой страницей, однако, когда работа завершена, она не просто отбрасывается, вместо этого SQL Server пытается буферизировать как можно больше страниц в памяти, и поэтому страница вместо этого находится в буферном пуле- список страниц, которые все еще находятся в памяти, однако доступны для повторного использования, если это необходимо (удаление и последующее использование при доступе к другой странице).

SQL Server отслеживает, какие страницы доступны в буферном пуле, чтобы по возможности избежать чтения или записи на диск — существует сложный набор правил, определяющих, когда страница перепрофилируется (включая «отложенную запись» любых грязных страниц на диск, если были внесены какие-либо изменения), чтобы попытатьсяи сохраняйте часто используемые страницы в памяти и минимизируйте промахи в кэше. По сути, SQL Server постоянно пытается использовать как можно больше памяти, не вызывая сбоев страницы ОС.

Что касается того, как он узнает, какие страницы загружать, это в основном индексирование с понижением — индексы (которые также хранятся на страницах) структурированы таким образом, что SQL Server может перемещаться по индексу и находить соответствующую запись в индексе (в зависимости от запроса) с минимальным количеством операций чтения. Затем индекс содержит ссылки, информирующие SQL Server о том, какие страницы содержат фактические данные.

Это огромное упрощение, однако оно должно, по крайней мере, дать общее представление о том, как все работает. Если вам интересно узнать больше, я рекомендую страницу Википедии о SQL Server, в частности раздел «Хранение данных». Существует также ряд книг по внутренней части SQL Server, которые я нахожу очень информативными.