Изменения

Перейти к: навигация, поиск

Подсистема хранения данных

3981 байт добавлено, 00:19, 28 декабря 2021
final
{{В разработке}}
{{Определение
|definition='''Подсистема хранения данных''' (англ. ''database engine'', ''storage engine'') — компонент [[Архитектура РСУБД|СУБД]], управляющий механизмами хранения баз данных, или библиотека, подключаемая к программам и дающая им функции [[Архитектура РСУБД|СУБД]].
Библиотека же позволяет программе использовать определённый формат файлов баз данных для манипулирования данными. В более сложном случае, она позволяет нескольким программам работать с общими файлами баз данных одновременно, используя те или иные механизмы блокировок.
В некоторых СУБД подсистема хранения неотделима от неё самой, но ряд подсистем могут встраиваться или подключаться к разным СУБД, например, системы семейства MySQL<ref>[https://www.mysql.comMySQL]</ref>. Некоторые известные подключаемые подсистемы хранения: SQLite<ref>[http://www.sqlite.orgSQLite]</ref>, DBM<ref>[https://en.wikipedia.org/wiki/DBM_(computing)DBM] </ref> (ключ — значение).
== Структура ==
{{Определение
|definition='''Структура данных''' — это абстрактная конструкция, в которой данные размещаются четко определенным образом.
В некоторых СУБД администраторы баз данных имеют возможность выбирать из вариантов структур данных для содержания пользовательских данных по соображениям производительности. Иногда структуры данных имеют выбираемые параметры для настройки производительности базы данных.
 
= Организация данных =
* Файл – одна или несколько таблиц (чаще всего);
* Таблица – несколько страниц;
* Страница – несколько записей.
 
=== Какие проблемы? ===
Записи длиннее страницы. Не все СУБД это позволяют (записи длиннее страницы не поддерживаются (исключение - колонки BLOB, CLOB, которые могут храниться отдельно))
 
== Модули системы хранения ==
[[Файл:dbms-data-access.png|450px|thumb|right|Схема доступа к данным]]
 
=== Диспетчер диска ===
* Каталог страниц
* Оптимизация последовательностей страниц
=== Диспетчер страниц ===
* Доступ к страницам
* Распределение памяти
* Выгрузка данных
=== Диспетчер записей ===
* Доступ к записям
 
В решении задачи поиска конкретного фрагмента данных в базе данных и передачи его пользователю участвует несколько различных уровней программного обеспечения. Безусловно, подробности устройства этих уровней в значительной степени зависят от конкретной системы (к тому же в разных системах часто применяется различная терминология), но используемые при этом принципы являются довольно стандартными, и эти принципы кратко описаны ниже:
 
#Вначале СУБД определяет, какая ей требуется запись, и передает диспетчеру записей запрос на выборку этой записи. (В целях этого простого описания предполагается, что СУБД обладает способностью заблаговременно и точно определять, какая именно запись ей потребуется. На практике чаще всего возникает необходимость сделать выборку набора из нескольких записей и выполнить поиск среди этих записи в оперативной памяти, чтобы найти ту конкретную запись, которая действительно требуется. Но, в принципе, это означает лишь то, что последовательность шагов 1—3 иногда приходится повторять для каждой записи из этого набора);
#Диспетчер страниц свою очередь определяет, какая страница содержит требуемую запись, и передает диспетчеру диска запрос на выборку этой страницы;
#Наконец, диспетчер диска определяет физическое местонахождение желаемой страницы на диске и выдает необходимый запрос на выполнение операции ввода-вывода на диске.
 
'''''Примечание.''''' Безусловно, что иногда требуемая страница может уже находиться в буфере оперативной памяти в результате ранее выполненной операции выборки, и в этом случае, безусловно, необходимость повторно осуществлять ее выборку не возникает.
== Страничная организация памяти ==
** вначале к таблице страниц, а затем уже к памяти:
*** '''''Решение:''''' аппаратный КЭШ для обращений к таблице страниц ('''''TLB''''' translation lookaside buffer – буфер внутри процессора);
* Большой объем памяти, требуемый для хранения таблиц страниц.  == Модули системы хранения ==[[Файл:dbms-data-access.png|450px|thumb|right|Схема доступа к данным]] === Диспетчер диска ===* Каталог страниц* Оптимизация последовательностей страниц=== Диспетчер страниц ===* Доступ к страницам* Распределение памяти* Выгрузка данных=== Диспетчер записей ===* Доступ к записям В решении задачи поиска конкретного фрагмента данных в базе данных и передачи его пользователю участвует несколько различных уровней программного обеспечения. Безусловно, подробности устройства этих уровней в значительной степени зависят от конкретной системы (к тому же в разных системах часто применяется различная терминология), но используемые при этом принципы являются довольно стандартными, и эти принципы кратко описаны ниже: #Вначале СУБД определяет, какая ей требуется запись, и передает диспетчеру записей запрос на выборку этой записи. (В целях этого простого описания предполагается, что СУБД обладает способностью заблаговременно и точно определять, какая именно запись ей потребуется. На практике чаще всего возникает необходимость сделать выборку набора из нескольких записей и выполнить поиск среди этих записи в оперативной памяти, чтобы найти ту конкретную запись, которая действительно требуется. Но, в принципе, это означает лишь то, что последовательность шагов 1—3 иногда приходится повторять для каждой записи из этого набора);#Диспетчер страниц свою очередь определяет, какая страница содержит требуемую запись, и передает диспетчеру диска запрос на выборку этой страницы;#Наконец, диспетчер диска определяет физическое местонахождение желаемой страницы на диске и выдает необходимый запрос на выполнение операции ввода-вывода на диске. '''''Примечание.''''' Безусловно, что иногда требуемая страница может уже находиться в буфере оперативной памяти в результате ранее выполненной операции выборки, и в этом случае, безусловно, необходимость повторно осуществлять ее выборку не возникает. == Организация данных ==* Файл – одна или несколько таблиц (чаще всего);* Таблица – несколько страниц;* Страница – несколько записей. === Какие проблемы? ===Записи длиннее страницы. Не все СУБД это позволяют (записи длиннее страницы не поддерживаются (исключение - колонки BLOB, CLOB, которые могут храниться отдельно))
== Список страниц ==
* Диспетчер диска – последовательности
* Диспетчер памяти – предвыборка
 
Все множество страниц на диске разбивается на коллекцию непересекающихся подмножеств, называемых наборами страниц. Один из этих наборов страниц (набор свободных страниц) служит в качестве пула доступных (т.е. не используемых в настоящее время) страниц; все другие страницы рассматриваются как содержащие значимые данные. Включение страниц в наборы страниц и исключение страниц из этих наборов осуществляется диспетчером диска в ответ на запросы диспетчера файлов.
 
Каждый файл обозначается именем файла или идентификатором файла, уникальным, по меньшей мере, в содержащем его наборе страниц, а каждая запись, в свою очередь, обозначается номером записи или '''идентификатором записи''' ('''''Record I D — RID'''''), уникальным, по меньшей мере, в содержащем его файле. (Обычно на практике идентификатор записи является уникальным не только в содержащем его файле, но фактически и на всем диске, поскольку он, как правило, состоит из комбинации номера страницы и некоторого значения, уникального в пределах этой страницы.
=== Идентификатор записи (RID) ===
== Сжатие данных ==
Тратим Методы сжатия используются для уменьшения объема памяти, необходимого для хранения определенной коллекции данных. Очень часто результатом такого сжатия становится не только экономия пространства памяти, но и сокращение количества операций ввода-вывода на диске (причем, возможно, еще более значительное по сравнению с экономией памяти). Дело в том, что если данные занимают меньше места, то для доступа к ним требуется меньше операций ввода-вывода. С другой стороны, требуется дополнительная обработка для восстановления данных (преобразования сжатых данных в исходный формат) после их выборки. Иначе говоря, тратим больше процессорного времени, в надежде потратить меньше времени для ввода/вывода (чаще всего окупается).
* Больше вычислений
* Меньше ввода-вывода
* Часто – быстрее
 
В основе методов сжатия лежит тот факт, что значения данных почти никогда не бывают полностью случайными и характеризуются определенной степенью предсказуемости. В качестве простейшего примера можно указать, что если имя некоторого лица в файле имен и адресов начинается с буквы R, то весьма вероятно, что имя следующего лица также будет начинаться с буквы R, разумеется, при условии, что файл отсортирован по именам в алфавитном порядке.
Мы можем прибегать к использованию структур данных, поскольку мы храним связанные записи, в частности у них одинаковая структура и т.д.
=== Пример ===
* Сжатие по полям;* Инкрементальное сжатие;* Префиксное сжатие;* Суффиксное сжатие;* Кодирование [[Алгоритм Хаффмана|по методу Хаффмана]]. == Примечания == <references />
== Литература ==
* ''Дейт К. Введение в системы баз данных (Приложение Г)''
* ''Кнут Д. Искусство программирования. Том 3. Сортировка и поиск''
Анонимный участник

Навигация