Подсистема хранения данных — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (update literature)
м (rollbackEdits.php mass rollback)
 
(не показано 9 промежуточных версий 5 участников)
Строка 1: Строка 1:
 +
{{Определение
 +
|definition='''Подсистема хранения данных''' (англ. ''database engine'', ''storage engine'') — компонент [[Архитектура РСУБД|СУБД]], управляющий механизмами хранения баз данных, или библиотека, подключаемая к программам и дающая им функции [[Архитектура РСУБД|СУБД]].
 +
}}
 +
 +
Подсистема хранения данных отвечает за размещение баз данных (как правило, в файлах) и организацию конкурентного доступа к ним. Для манипулирования данными и структурами БД обычно используется язык SQL, при этом интерпретатор языка SQL обычно является компонентом СУБД, а не подсистемы хранения.
 +
 +
Библиотека же позволяет программе использовать определённый формат файлов баз данных для манипулирования данными. В более сложном случае, она позволяет нескольким программам работать с общими файлами баз данных одновременно, используя те или иные механизмы блокировок.
 +
 +
В некоторых СУБД подсистема хранения неотделима от неё самой, но ряд подсистем могут встраиваться или подключаться к разным СУБД, например, системы семейства MySQL<ref>[https://www.mysql.com MySQL]</ref>. Некоторые известные подключаемые подсистемы хранения: SQLite<ref>[http://www.sqlite.org SQLite]</ref>, DBM<ref>[https://en.wikipedia.org/wiki/DBM_(computing) DBM]</ref> (ключ — значение).
 +
 +
== Структура ==
 +
{{Определение
 +
|definition='''Структура данных''' — это абстрактная конструкция, в которой данные размещаются четко определенным образом.
 +
}}
 +
 +
{| class="wikitable" style="float:right; margin-left:0.8em; clear:right;"
 +
|+ Типы памяти
 +
|-
 +
! scope="col"| Тип
 +
! scope="col"| Характеристика
 +
! scope="col"| Величина
 +
|-
 +
| rowspan="4" | Оперативная память
 +
|| Объём
 +
| 16 - 256 ГБ
 +
|-
 +
| Цена
 +
| ~5 $/ГБ
 +
|-
 +
| Быстродействие
 +
| ~10+ ГБ/с
 +
|-
 +
| Время доступа
 +
| 1-10 μ/с
 +
|-
 +
| rowspan="4" | SSD
 +
|| Объём
 +
| 0.5 - 8 ТБ
 +
|-
 +
| Цена
 +
| ~0.1 $/ГБ
 +
|-
 +
| Быстродействие
 +
| 0.500-6 ГБ/с
 +
|-
 +
| Время доступа
 +
| 0.1-0.2 мс
 +
|-
 +
| rowspan="4" | Жёсткие диски
 +
|| Объём
 +
| 4 - 12 ТБ
 +
|-
 +
| Цена
 +
| ~0.03 $/ГБ
 +
|-
 +
| Быстродействие
 +
| 10-200 МБ/с
 +
|-
 +
| Время доступа
 +
| 5-100 мс
 +
|}
 +
 +
СУБД могут хранить данные в оперативной памяти, на SSD, на жёстком диске.
 +
 +
Многие СУБД для хранения данных всё ещё оптимизируют под особенности жёсткие дисков. Хотим сократить общее количество обращений к диску и по возможности сделать их последовательными.
 +
=== Особенности жёстких дисков ===
 +
* Большое время поиска
 +
* Скорость чтения
 +
** Последовательный доступ – средняя
 +
** Случайный доступ – низкая
 +
* Сократить число обращений
 +
** Сделать их последовательными
 +
Основная причина, побуждающая к постоянному совершенствованию всей технологии организации структур хранения и методов доступа, состоит в том, что характеристики доступа к диску намного хуже по сравнению с соответствующими характеристиками доступа к оперативной памяти.
 +
 +
Таким образом, наиболее важное направление повышения производительности состоит в уменьшении до минимума количества операций доступа к диску (или дисковых операций ввода—вывода).
 +
 +
По природе современных компьютеров большая часть части базы данных внутри компьютера, на котором размещена СУБД, находится (частично реплицируется) в энергозависимой памяти.
 +
 +
Эффективная структура данных позволяет манипулировать данными эффективными способами. Манипуляции с данными могут включать в себя вставку, удаление, обновление и извлечение данных в различных режимах.
 +
 +
Определенный тип структуры данных может быть очень эффективным в одних операциях и очень неэффективным в других.
 +
 +
Тип структуры данных выбирается при разработке СУБД, чтобы наилучшим образом соответствовать операциям, необходимым для типов данных, которые она содержит.
 +
 +
Тип структуры данных, выбранный для выполнения определенной задачи, обычно учитывает также тип хранилища, в котором она находится (например, скорость доступа, минимальный размер обрабатываемого куска хранилища и т.д.).
 +
 +
В некоторых СУБД администраторы баз данных имеют возможность выбирать из вариантов структур данных для содержания пользовательских данных по соображениям производительности. Иногда структуры данных имеют выбираемые параметры для настройки производительности базы данных.
 +
 +
== Страничная организация памяти ==
 +
{{Определение
 +
|definition='''Страничная память''' — способ организации виртуальной памяти, при котором виртуальные адреса отображаются на физические постранично.
 +
}}
 +
 +
Все современные СУБД умеют использовать.
 +
 +
=== Память разбита на равные страницы ===
 +
* Прямое отображение в память
 +
* Загрузка и выгрузка всей страницы
 +
* Для IA32 и AMD64 обычно 4КБ (для маленьких страниц), 2МБ или 4МБ (для больших страниц)
 +
 +
=== Обработка быстрее чем чтение ===
 +
Обработка в оперативной памяти обычно быстрее, чем чтение. Позволяет заниматься промежуточным сжатием данных и т.д. (чтобы уменьшить объём хранимый на диске)
 +
 +
=== Последовательности страниц ===
 +
* Хранят данные одного типа. Обычно данный одной таблицы или индекса, для которых типичны к следующей/предыдущей странице.
 +
* Частые переходы к следующей/предыдущей странице
 +
* Желательно хранить последовательно
 +
 +
=== Преимущества страничной памяти ===
 +
* Легко выделять физическую память —  списки свободных ячеек;
 +
* Естественный подход — все ячейки одного размера;
 +
 +
=== Недостатки страничной памяти ===
 +
* Внутренняя фрагментация;
 +
** Процессам может быть нужны размеры, некратные размеру страницы;
 +
** По сравнению с размером адресного пространства, размер страницы очень мал;
 +
* Накладные расходы при обращении к памяти;
 +
** вначале к таблице страниц, а затем уже к памяти:
 +
*** '''''Решение:''''' аппаратный КЭШ для обращений к таблице страниц ('''''TLB''''' translation lookaside buffer – буфер внутри процессора);
 +
* Большой объем памяти, требуемый для хранения таблиц страниц.
 +
 +
== Модули системы хранения ==
 +
[[Файл:dbms-data-access.png|450px|thumb|right|Схема доступа к данным]]
 +
 +
=== Диспетчер диска ===
 +
* Каталог страниц
 +
* Оптимизация последовательностей страниц
 +
=== Диспетчер страниц ===
 +
* Доступ к страницам
 +
* Распределение памяти
 +
* Выгрузка данных
 +
=== Диспетчер записей ===
 +
* Доступ к записям
 +
 +
В решении задачи поиска конкретного фрагмента данных в базе данных и передачи его пользователю участвует несколько различных уровней программного обеспечения. Безусловно, подробности устройства этих уровней в значительной степени зависят от конкретной системы (к тому же в разных системах часто применяется различная терминология), но используемые при этом принципы являются довольно стандартными, и эти принципы кратко описаны ниже:
 +
 +
#Вначале СУБД определяет, какая ей требуется запись, и передает диспетчеру записей запрос на выборку этой записи. (В целях этого простого описания предполагается, что СУБД обладает способностью заблаговременно и точно определять, какая именно запись ей потребуется. На практике чаще всего возникает необходимость сделать выборку набора из нескольких записей и выполнить поиск среди этих записи в оперативной памяти, чтобы найти ту конкретную запись, которая действительно требуется. Но, в принципе, это означает лишь то, что последовательность шагов 1—3 иногда приходится повторять для каждой записи из этого набора);
 +
#Диспетчер страниц свою очередь определяет, какая страница содержит требуемую запись, и передает диспетчеру диска запрос на выборку этой страницы;
 +
#Наконец, диспетчер диска определяет физическое местонахождение желаемой страницы на диске и выдает необходимый запрос на выполнение операции ввода-вывода на диске.
 +
 +
'''''Примечание.''''' Безусловно, что иногда требуемая страница может уже находиться в буфере оперативной памяти в результате ранее выполненной операции выборки, и в этом случае, безусловно, необходимость повторно осуществлять ее выборку не возникает.
 +
 +
== Организация данных ==
 +
* Файл – одна или несколько таблиц (чаще всего);
 +
* Таблица – несколько страниц;
 +
* Страница – несколько записей.
 +
 +
=== Какие проблемы? ===
 +
Записи длиннее страницы. Не все СУБД это позволяют (записи длиннее страницы не поддерживаются (исключение - колонки BLOB, CLOB, которые могут храниться отдельно))
 +
 +
== Список страниц ==
 +
[[Файл:dbms-page-list.png|470px|thumb|right|Схема списка страниц]]
 +
Типичным представлением является список страниц, который нужен диспетчеру памяти для организации их последовательного упорядочивания и предвыборки, если мы заранее знаем, что сканируем все страницы целиком.
 +
 +
* Диспетчер диска – последовательности
 +
* Диспетчер памяти – предвыборка
 +
 +
Все множество страниц на диске разбивается на коллекцию непересекающихся подмножеств, называемых наборами страниц. Один из этих наборов страниц (набор свободных страниц) служит в качестве пула доступных (т.е. не используемых в настоящее время) страниц; все другие страницы рассматриваются как содержащие значимые данные. Включение страниц в наборы страниц и исключение страниц из этих наборов осуществляется диспетчером диска в ответ на запросы диспетчера файлов.
 +
 +
Каждый файл обозначается именем файла или идентификатором файла, уникальным, по меньшей мере, в содержащем его наборе страниц, а каждая запись, в свою очередь, обозначается номером записи или '''идентификатором записи''' ('''''Record I D — RID'''''), уникальным, по меньшей мере, в содержащем его файле. (Обычно на практике идентификатор записи является уникальным не только в содержащем его файле, но фактически и на всем диске, поскольку он, как правило, состоит из комбинации номера страницы и некоторого значения, уникального в пределах этой страницы.
 +
 +
=== Идентификатор записи (RID) ===
 +
У нас есть идентификатор не только страницы, но и отдельных записей на странице для того, чтобы по идентификатору записи можно было легко было определить страницу на которой он лежит, он состоит из
 +
* Id страницы
 +
* Id записи внутри страницы
 +
 +
Не должен меняться со временем, поскольку используется одновременно во многих местах для ссылки на эту запись, иначе нам придётся хранить в памяти и на диске отображение из старых номеров в новые и каждый раз проверять не изменился ли Id (не дешево) или нужно будет найти все места, где идентификатор записи использовался и все поменять.
 +
 +
=== Хранение данных на странице ===
 +
В конце страницы помещается каталог записей, который по укороченному идентификатору записи позволяет определить, где соответствующая запись начинается.
 +
[[Файл:dbms-records-on-page.png|470px|none|Схема хранения данных на странице]]
 +
 +
Когда записи не помещаются, создаём страницу переполнения и переносим на неё примерно половину записей, что даст пространство для роста на соответствующей странице.
 +
[[Файл:dbms-overflow-page.png|470px|none|Схема страницы переполнения]]
 +
 +
==== Как избежать цепочек ====
 +
Чтобы не возникало связного списка страниц переполнения, запишем в исходную страницу указатель на место, где находится конкретная запись (исходную страницу всегда знаем, поскольку идентификатор записи - это в первую очередь идентификатор страницы).
 +
 +
== Сжатие данных ==
 +
Методы сжатия используются для уменьшения объема памяти, необходимого для хранения определенной коллекции данных. Очень часто результатом такого сжатия становится не только экономия пространства памяти, но и сокращение количества операций ввода-вывода на диске (причем, возможно, еще более значительное по сравнению с экономией памяти). Дело в том, что если данные занимают меньше места, то для доступа к ним требуется меньше операций ввода-вывода. С другой стороны, требуется дополнительная обработка для восстановления данных (преобразования сжатых данных в исходный формат) после их выборки.
 +
 +
Иначе говоря, тратим больше процессорного времени, в надежде потратить меньше времени для ввода/вывода (чаще всего окупается).
 +
* Больше вычислений
 +
* Меньше ввода-вывода
 +
* Часто – быстрее
 +
 +
В основе методов сжатия лежит тот факт, что значения данных почти никогда не бывают полностью случайными и характеризуются определенной степенью предсказуемости. В качестве простейшего примера можно указать, что если имя некоторого лица в файле имен и адресов начинается с буквы R, то весьма вероятно, что имя следующего лица также будет начинаться с буквы R, разумеется, при условии, что файл отсортирован по именам в алфавитном порядке.
 +
 +
Мы можем прибегать к использованию структур данных, поскольку мы храним связанные записи, в частности у них одинаковая структура и т.д.
 +
 +
=== Пример ===
 +
* Сжатие по полям;
 +
* Инкрементальное сжатие;
 +
* Префиксное сжатие;
 +
* Суффиксное сжатие;
 +
* Кодирование [[Алгоритм Хаффмана|по методу Хаффмана]].
 +
 +
== Примечания ==
 +
 +
<references />
 +
 
== Литература ==
 
== Литература ==
 
* ''Дейт К. Введение в системы баз данных (Приложение Г)''
 
* ''Дейт К. Введение в системы баз данных (Приложение Г)''

Текущая версия на 19:08, 4 сентября 2022

Определение:
Подсистема хранения данных (англ. database engine, storage engine) — компонент СУБД, управляющий механизмами хранения баз данных, или библиотека, подключаемая к программам и дающая им функции СУБД.


Подсистема хранения данных отвечает за размещение баз данных (как правило, в файлах) и организацию конкурентного доступа к ним. Для манипулирования данными и структурами БД обычно используется язык SQL, при этом интерпретатор языка SQL обычно является компонентом СУБД, а не подсистемы хранения.

Библиотека же позволяет программе использовать определённый формат файлов баз данных для манипулирования данными. В более сложном случае, она позволяет нескольким программам работать с общими файлами баз данных одновременно, используя те или иные механизмы блокировок.

В некоторых СУБД подсистема хранения неотделима от неё самой, но ряд подсистем могут встраиваться или подключаться к разным СУБД, например, системы семейства MySQL[1]. Некоторые известные подключаемые подсистемы хранения: SQLite[2], DBM[3] (ключ — значение).

Структура

Определение:
Структура данных — это абстрактная конструкция, в которой данные размещаются четко определенным образом.


Типы памяти
Тип Характеристика Величина
Оперативная память Объём 16 - 256 ГБ
Цена ~5 $/ГБ
Быстродействие ~10+ ГБ/с
Время доступа 1-10 μ/с
SSD Объём 0.5 - 8 ТБ
Цена ~0.1 $/ГБ
Быстродействие 0.500-6 ГБ/с
Время доступа 0.1-0.2 мс
Жёсткие диски Объём 4 - 12 ТБ
Цена ~0.03 $/ГБ
Быстродействие 10-200 МБ/с
Время доступа 5-100 мс

СУБД могут хранить данные в оперативной памяти, на SSD, на жёстком диске.

Многие СУБД для хранения данных всё ещё оптимизируют под особенности жёсткие дисков. Хотим сократить общее количество обращений к диску и по возможности сделать их последовательными.

Особенности жёстких дисков

  • Большое время поиска
  • Скорость чтения
    • Последовательный доступ – средняя
    • Случайный доступ – низкая
  • Сократить число обращений
    • Сделать их последовательными

Основная причина, побуждающая к постоянному совершенствованию всей технологии организации структур хранения и методов доступа, состоит в том, что характеристики доступа к диску намного хуже по сравнению с соответствующими характеристиками доступа к оперативной памяти.

Таким образом, наиболее важное направление повышения производительности состоит в уменьшении до минимума количества операций доступа к диску (или дисковых операций ввода—вывода).

По природе современных компьютеров большая часть части базы данных внутри компьютера, на котором размещена СУБД, находится (частично реплицируется) в энергозависимой памяти.

Эффективная структура данных позволяет манипулировать данными эффективными способами. Манипуляции с данными могут включать в себя вставку, удаление, обновление и извлечение данных в различных режимах.

Определенный тип структуры данных может быть очень эффективным в одних операциях и очень неэффективным в других.

Тип структуры данных выбирается при разработке СУБД, чтобы наилучшим образом соответствовать операциям, необходимым для типов данных, которые она содержит.

Тип структуры данных, выбранный для выполнения определенной задачи, обычно учитывает также тип хранилища, в котором она находится (например, скорость доступа, минимальный размер обрабатываемого куска хранилища и т.д.).

В некоторых СУБД администраторы баз данных имеют возможность выбирать из вариантов структур данных для содержания пользовательских данных по соображениям производительности. Иногда структуры данных имеют выбираемые параметры для настройки производительности базы данных.

Страничная организация памяти

Определение:
Страничная память — способ организации виртуальной памяти, при котором виртуальные адреса отображаются на физические постранично.


Все современные СУБД умеют использовать.

Память разбита на равные страницы

  • Прямое отображение в память
  • Загрузка и выгрузка всей страницы
  • Для IA32 и AMD64 обычно 4КБ (для маленьких страниц), 2МБ или 4МБ (для больших страниц)

Обработка быстрее чем чтение

Обработка в оперативной памяти обычно быстрее, чем чтение. Позволяет заниматься промежуточным сжатием данных и т.д. (чтобы уменьшить объём хранимый на диске)

Последовательности страниц

  • Хранят данные одного типа. Обычно данный одной таблицы или индекса, для которых типичны к следующей/предыдущей странице.
  • Частые переходы к следующей/предыдущей странице
  • Желательно хранить последовательно

Преимущества страничной памяти

  • Легко выделять физическую память — списки свободных ячеек;
  • Естественный подход — все ячейки одного размера;

Недостатки страничной памяти

  • Внутренняя фрагментация;
    • Процессам может быть нужны размеры, некратные размеру страницы;
    • По сравнению с размером адресного пространства, размер страницы очень мал;
  • Накладные расходы при обращении к памяти;
    • вначале к таблице страниц, а затем уже к памяти:
      • Решение: аппаратный КЭШ для обращений к таблице страниц (TLB translation lookaside buffer – буфер внутри процессора);
  • Большой объем памяти, требуемый для хранения таблиц страниц.

Модули системы хранения

Схема доступа к данным

Диспетчер диска

  • Каталог страниц
  • Оптимизация последовательностей страниц

Диспетчер страниц

  • Доступ к страницам
  • Распределение памяти
  • Выгрузка данных

Диспетчер записей

  • Доступ к записям

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

  1. Вначале СУБД определяет, какая ей требуется запись, и передает диспетчеру записей запрос на выборку этой записи. (В целях этого простого описания предполагается, что СУБД обладает способностью заблаговременно и точно определять, какая именно запись ей потребуется. На практике чаще всего возникает необходимость сделать выборку набора из нескольких записей и выполнить поиск среди этих записи в оперативной памяти, чтобы найти ту конкретную запись, которая действительно требуется. Но, в принципе, это означает лишь то, что последовательность шагов 1—3 иногда приходится повторять для каждой записи из этого набора);
  2. Диспетчер страниц свою очередь определяет, какая страница содержит требуемую запись, и передает диспетчеру диска запрос на выборку этой страницы;
  3. Наконец, диспетчер диска определяет физическое местонахождение желаемой страницы на диске и выдает необходимый запрос на выполнение операции ввода-вывода на диске.

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

Организация данных

  • Файл – одна или несколько таблиц (чаще всего);
  • Таблица – несколько страниц;
  • Страница – несколько записей.

Какие проблемы?

Записи длиннее страницы. Не все СУБД это позволяют (записи длиннее страницы не поддерживаются (исключение - колонки BLOB, CLOB, которые могут храниться отдельно))

Список страниц

Схема списка страниц

Типичным представлением является список страниц, который нужен диспетчеру памяти для организации их последовательного упорядочивания и предвыборки, если мы заранее знаем, что сканируем все страницы целиком.

  • Диспетчер диска – последовательности
  • Диспетчер памяти – предвыборка

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

Каждый файл обозначается именем файла или идентификатором файла, уникальным, по меньшей мере, в содержащем его наборе страниц, а каждая запись, в свою очередь, обозначается номером записи или идентификатором записи (Record I D — RID), уникальным, по меньшей мере, в содержащем его файле. (Обычно на практике идентификатор записи является уникальным не только в содержащем его файле, но фактически и на всем диске, поскольку он, как правило, состоит из комбинации номера страницы и некоторого значения, уникального в пределах этой страницы.

Идентификатор записи (RID)

У нас есть идентификатор не только страницы, но и отдельных записей на странице для того, чтобы по идентификатору записи можно было легко было определить страницу на которой он лежит, он состоит из

  • Id страницы
  • Id записи внутри страницы

Не должен меняться со временем, поскольку используется одновременно во многих местах для ссылки на эту запись, иначе нам придётся хранить в памяти и на диске отображение из старых номеров в новые и каждый раз проверять не изменился ли Id (не дешево) или нужно будет найти все места, где идентификатор записи использовался и все поменять.

Хранение данных на странице

В конце страницы помещается каталог записей, который по укороченному идентификатору записи позволяет определить, где соответствующая запись начинается.

Схема хранения данных на странице

Когда записи не помещаются, создаём страницу переполнения и переносим на неё примерно половину записей, что даст пространство для роста на соответствующей странице.

Схема страницы переполнения

Как избежать цепочек

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

Сжатие данных

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

Иначе говоря, тратим больше процессорного времени, в надежде потратить меньше времени для ввода/вывода (чаще всего окупается).

  • Больше вычислений
  • Меньше ввода-вывода
  • Часто – быстрее

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

Мы можем прибегать к использованию структур данных, поскольку мы храним связанные записи, в частности у них одинаковая структура и т.д.

Пример

  • Сжатие по полям;
  • Инкрементальное сжатие;
  • Префиксное сжатие;
  • Суффиксное сжатие;
  • Кодирование по методу Хаффмана.

Примечания

Литература

  • Дейт К. Введение в системы баз данных (Приложение Г)
  • Кнут Д. Искусство программирования. Том 3. Сортировка и поиск
  • Silberschatz A., Korth H. F., Sudarshan S. Database System Concepts