<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.170.80.235&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.170.80.235&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.170.80.235"/>
		<updated>2026-08-02T08:11:46Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=82051</id>
		<title>Подсистема хранения данных</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%BE%D0%B4%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85&amp;diff=82051"/>
				<updated>2021-12-27T21:19:56Z</updated>
		
		<summary type="html">&lt;p&gt;188.170.80.235: final&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition='''Подсистема хранения данных''' (англ. ''database engine'', ''storage engine'') — компонент [[Архитектура РСУБД|СУБД]], управляющий механизмами хранения баз данных, или библиотека, подключаемая к программам и дающая им функции [[Архитектура РСУБД|СУБД]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Подсистема хранения данных отвечает за размещение баз данных (как правило, в файлах) и организацию конкурентного доступа к ним. Для манипулирования данными и структурами БД обычно используется язык SQL, при этом интерпретатор языка SQL обычно является компонентом СУБД, а не подсистемы хранения.&lt;br /&gt;
&lt;br /&gt;
Библиотека же позволяет программе использовать определённый формат файлов баз данных для манипулирования данными. В более сложном случае, она позволяет нескольким программам работать с общими файлами баз данных одновременно, используя те или иные механизмы блокировок.&lt;br /&gt;
&lt;br /&gt;
В некоторых СУБД подсистема хранения неотделима от неё самой, но ряд подсистем могут встраиваться или подключаться к разным СУБД, например, системы семейства MySQL&amp;lt;ref&amp;gt;[https://www.mysql.com MySQL]&amp;lt;/ref&amp;gt;. Некоторые известные подключаемые подсистемы хранения: SQLite&amp;lt;ref&amp;gt;[http://www.sqlite.org SQLite]&amp;lt;/ref&amp;gt;, DBM&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/DBM_(computing) DBM]&amp;lt;/ref&amp;gt; (ключ — значение).&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Структура данных''' — это абстрактная конструкция, в которой данные размещаются четко определенным образом.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;float:right; margin-left:0.8em; clear:right;&amp;quot;&lt;br /&gt;
|+ Типы памяти&lt;br /&gt;
|-&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Тип&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Характеристика&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Величина&lt;br /&gt;
|-&lt;br /&gt;
	| rowspan=&amp;quot;4&amp;quot; | Оперативная память &lt;br /&gt;
			|| Объём&lt;br /&gt;
			| 16 - 256 ГБ&lt;br /&gt;
		|- &lt;br /&gt;
			| Цена &lt;br /&gt;
			| ~5 $/ГБ&lt;br /&gt;
		|- &lt;br /&gt;
			| Быстродействие&lt;br /&gt;
			| ~10+ ГБ/с&lt;br /&gt;
		|- &lt;br /&gt;
			| Время доступа&lt;br /&gt;
			| 1-10 μ/с&lt;br /&gt;
|-&lt;br /&gt;
	| rowspan=&amp;quot;4&amp;quot; | SSD&lt;br /&gt;
			|| Объём&lt;br /&gt;
			| 0.5 - 8 ТБ&lt;br /&gt;
		|- &lt;br /&gt;
			| Цена&lt;br /&gt;
			| ~0.1 $/ГБ&lt;br /&gt;
		|- &lt;br /&gt;
			| Быстродействие&lt;br /&gt;
			| 0.500-6 ГБ/с&lt;br /&gt;
		|- &lt;br /&gt;
			| Время доступа&lt;br /&gt;
			| 0.1-0.2 мс&lt;br /&gt;
|-&lt;br /&gt;
	| rowspan=&amp;quot;4&amp;quot; | Жёсткие диски&lt;br /&gt;
			|| Объём&lt;br /&gt;
			| 4 - 12 ТБ&lt;br /&gt;
		|- &lt;br /&gt;
			| Цена&lt;br /&gt;
			| ~0.03 $/ГБ&lt;br /&gt;
		|- &lt;br /&gt;
			| Быстродействие&lt;br /&gt;
			| 10-200 МБ/с&lt;br /&gt;
		|- &lt;br /&gt;
			| Время доступа&lt;br /&gt;
			| 5-100 мс&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
СУБД могут хранить данные в оперативной памяти, на SSD, на жёстком диске.&lt;br /&gt;
&lt;br /&gt;
Многие СУБД для хранения данных всё ещё оптимизируют под особенности жёсткие дисков. Хотим сократить общее количество обращений к диску и по возможности сделать их последовательными.&lt;br /&gt;
=== Особенности жёстких дисков ===&lt;br /&gt;
* Большое время поиска&lt;br /&gt;
* Скорость чтения&lt;br /&gt;
** Последовательный доступ – средняя&lt;br /&gt;
** Случайный доступ – низкая&lt;br /&gt;
* Сократить число обращений&lt;br /&gt;
** Сделать их последовательными&lt;br /&gt;
Основная причина, побуждающая к постоянному совершенствованию всей технологии организации структур хранения и методов доступа, состоит в том, что характеристики доступа к диску намного хуже по сравнению с соответствующими характеристиками доступа к оперативной памяти.&lt;br /&gt;
&lt;br /&gt;
Таким образом, наиболее важное направление повышения производительности состоит в уменьшении до минимума количества операций доступа к диску (или дисковых операций ввода—вывода).&lt;br /&gt;
&lt;br /&gt;
По природе современных компьютеров большая часть части базы данных внутри компьютера, на котором размещена СУБД, находится (частично реплицируется) в энергозависимой памяти. &lt;br /&gt;
&lt;br /&gt;
Эффективная структура данных позволяет манипулировать данными эффективными способами. Манипуляции с данными могут включать в себя вставку, удаление, обновление и извлечение данных в различных режимах. &lt;br /&gt;
&lt;br /&gt;
Определенный тип структуры данных может быть очень эффективным в одних операциях и очень неэффективным в других. &lt;br /&gt;
&lt;br /&gt;
Тип структуры данных выбирается при разработке СУБД, чтобы наилучшим образом соответствовать операциям, необходимым для типов данных, которые она содержит. &lt;br /&gt;
&lt;br /&gt;
Тип структуры данных, выбранный для выполнения определенной задачи, обычно учитывает также тип хранилища, в котором она находится (например, скорость доступа, минимальный размер обрабатываемого куска хранилища и т.д.).&lt;br /&gt;
&lt;br /&gt;
В некоторых СУБД администраторы баз данных имеют возможность выбирать из вариантов структур данных для содержания пользовательских данных по соображениям производительности. Иногда структуры данных имеют выбираемые параметры для настройки производительности базы данных.&lt;br /&gt;
&lt;br /&gt;
== Страничная организация памяти ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Страничная память''' — способ организации виртуальной памяти, при котором виртуальные адреса отображаются на физические постранично.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Все современные СУБД умеют использовать.&lt;br /&gt;
&lt;br /&gt;
=== Память разбита на равные страницы ===&lt;br /&gt;
* Прямое отображение в память&lt;br /&gt;
* Загрузка и выгрузка всей страницы&lt;br /&gt;
* Для IA32 и AMD64 обычно 4КБ (для маленьких страниц), 2МБ или 4МБ (для больших страниц)&lt;br /&gt;
&lt;br /&gt;
=== Обработка быстрее чем чтение ===&lt;br /&gt;
Обработка в оперативной памяти обычно быстрее, чем чтение. Позволяет заниматься промежуточным сжатием данных и т.д. (чтобы уменьшить объём хранимый на диске)&lt;br /&gt;
&lt;br /&gt;
=== Последовательности страниц ===&lt;br /&gt;
* Хранят данные одного типа. Обычно данный одной таблицы или индекса, для которых типичны к следующей/предыдущей странице.&lt;br /&gt;
* Частые переходы к следующей/предыдущей странице&lt;br /&gt;
* Желательно хранить последовательно&lt;br /&gt;
&lt;br /&gt;
=== Преимущества страничной памяти ===&lt;br /&gt;
* Легко выделять физическую память —  списки свободных ячеек;&lt;br /&gt;
* Естественный подход — все ячейки одного размера; &lt;br /&gt;
&lt;br /&gt;
=== Недостатки страничной памяти ===&lt;br /&gt;
* Внутренняя фрагментация;&lt;br /&gt;
** Процессам может быть нужны размеры, некратные размеру страницы;&lt;br /&gt;
** По сравнению с размером адресного пространства, размер страницы очень мал;&lt;br /&gt;
* Накладные расходы при обращении к памяти;&lt;br /&gt;
** вначале к таблице страниц, а затем уже к памяти: &lt;br /&gt;
*** '''''Решение:''''' аппаратный КЭШ для обращений к таблице страниц ('''''TLB''''' translation lookaside buffer – буфер внутри процессора);&lt;br /&gt;
* Большой объем памяти, требуемый для хранения таблиц страниц.&lt;br /&gt;
&lt;br /&gt;
== Модули системы хранения ==&lt;br /&gt;
[[Файл:dbms-data-access.png|450px|thumb|right|Схема доступа к данным]]&lt;br /&gt;
&lt;br /&gt;
=== Диспетчер диска ===&lt;br /&gt;
* Каталог страниц&lt;br /&gt;
* Оптимизация последовательностей страниц&lt;br /&gt;
=== Диспетчер страниц ===&lt;br /&gt;
* Доступ к страницам&lt;br /&gt;
* Распределение памяти&lt;br /&gt;
* Выгрузка данных&lt;br /&gt;
=== Диспетчер записей ===&lt;br /&gt;
* Доступ к записям&lt;br /&gt;
&lt;br /&gt;
В решении задачи поиска конкретного фрагмента данных в базе данных и передачи его пользователю участвует несколько различных уровней программного обеспечения. Безусловно, подробности устройства этих уровней в значительной степени зависят от конкретной системы (к тому же в разных системах часто применяется различная терминология), но используемые при этом принципы являются довольно стандартными, и эти принципы кратко описаны ниже:&lt;br /&gt;
&lt;br /&gt;
#Вначале СУБД определяет, какая ей требуется запись, и передает диспетчеру записей запрос на выборку этой записи. (В целях этого простого описания предполагается, что СУБД обладает способностью заблаговременно и точно определять, какая именно запись ей потребуется. На практике чаще всего возникает необходимость сделать выборку набора из нескольких записей и выполнить поиск среди этих записи в оперативной памяти, чтобы найти ту конкретную запись, которая действительно требуется. Но, в принципе, это означает лишь то, что последовательность шагов 1—3 иногда приходится повторять для каждой записи из этого набора);&lt;br /&gt;
#Диспетчер страниц свою очередь определяет, какая страница содержит требуемую запись, и передает диспетчеру диска запрос на выборку этой страницы;&lt;br /&gt;
#Наконец, диспетчер диска определяет физическое местонахождение желаемой страницы на диске и выдает необходимый запрос на выполнение операции ввода-вывода на диске.&lt;br /&gt;
&lt;br /&gt;
'''''Примечание.''''' Безусловно, что иногда требуемая страница может уже находиться в буфере оперативной памяти в результате ранее выполненной операции выборки, и в этом случае, безусловно, необходимость повторно осуществлять ее выборку не возникает.&lt;br /&gt;
&lt;br /&gt;
== Организация данных ==&lt;br /&gt;
* Файл – одна или несколько таблиц (чаще всего);&lt;br /&gt;
* Таблица – несколько страниц;&lt;br /&gt;
* Страница – несколько записей.&lt;br /&gt;
&lt;br /&gt;
=== Какие проблемы? ===&lt;br /&gt;
Записи длиннее страницы. Не все СУБД это позволяют (записи длиннее страницы не поддерживаются (исключение - колонки BLOB, CLOB, которые могут храниться отдельно))&lt;br /&gt;
&lt;br /&gt;
== Список страниц ==&lt;br /&gt;
[[Файл:dbms-page-list.png|470px|thumb|right|Схема списка страниц]]&lt;br /&gt;
Типичным представлением является список страниц, который нужен диспетчеру памяти для организации их последовательного упорядочивания и предвыборки, если мы заранее знаем, что сканируем все страницы целиком.&lt;br /&gt;
&lt;br /&gt;
* Диспетчер диска – последовательности&lt;br /&gt;
* Диспетчер памяти – предвыборка&lt;br /&gt;
&lt;br /&gt;
Все множество страниц на диске разбивается на коллекцию непересекающихся подмножеств, называемых наборами страниц. Один из этих наборов страниц (набор свободных страниц) служит в качестве пула доступных (т.е. не используемых в настоящее время) страниц; все другие страницы рассматриваются как содержащие значимые данные. Включение страниц в наборы страниц и исключение страниц из этих наборов осуществляется диспетчером диска в ответ на запросы диспетчера файлов. &lt;br /&gt;
&lt;br /&gt;
Каждый файл обозначается именем файла или идентификатором файла, уникальным, по меньшей мере, в содержащем его наборе страниц, а каждая запись, в свою очередь, обозначается номером записи или '''идентификатором записи''' ('''''Record I D — RID'''''), уникальным, по меньшей мере, в содержащем его файле. (Обычно на практике идентификатор записи является уникальным не только в содержащем его файле, но фактически и на всем диске, поскольку он, как правило, состоит из комбинации номера страницы и некоторого значения, уникального в пределах этой страницы.&lt;br /&gt;
&lt;br /&gt;
=== Идентификатор записи (RID) ===&lt;br /&gt;
У нас есть идентификатор не только страницы, но и отдельных записей на странице для того, чтобы по идентификатору записи можно было легко было определить страницу на которой он лежит, он состоит из &lt;br /&gt;
* Id страницы&lt;br /&gt;
* Id записи внутри страницы&lt;br /&gt;
&lt;br /&gt;
Не должен меняться со временем, поскольку используется одновременно во многих местах для ссылки на эту запись, иначе нам придётся хранить в памяти и на диске отображение из старых номеров в новые и каждый раз проверять не изменился ли Id (не дешево) или нужно будет найти все места, где идентификатор записи использовался и все поменять.&lt;br /&gt;
&lt;br /&gt;
=== Хранение данных на странице ===&lt;br /&gt;
В конце страницы помещается каталог записей, который по укороченному идентификатору записи позволяет определить, где соответствующая запись начинается.&lt;br /&gt;
[[Файл:dbms-records-on-page.png|470px|none|Схема хранения данных на странице]]&lt;br /&gt;
&lt;br /&gt;
Когда записи не помещаются, создаём страницу переполнения и переносим на неё примерно половину записей, что даст пространство для роста на соответствующей странице.&lt;br /&gt;
[[Файл:dbms-overflow-page.png|470px|none|Схема страницы переполнения]]&lt;br /&gt;
&lt;br /&gt;
==== Как избежать цепочек ====&lt;br /&gt;
Чтобы не возникало связного списка страниц переполнения, запишем в исходную страницу указатель на место, где находится конкретная запись (исходную страницу всегда знаем, поскольку идентификатор записи - это в первую очередь идентификатор страницы).&lt;br /&gt;
&lt;br /&gt;
== Сжатие данных ==&lt;br /&gt;
Методы сжатия используются для уменьшения объема памяти, необходимого для хранения определенной коллекции данных. Очень часто результатом такого сжатия становится не только экономия пространства памяти, но и сокращение количества операций ввода-вывода на диске (причем, возможно, еще более значительное по сравнению с экономией памяти). Дело в том, что если данные занимают меньше места, то для доступа к ним требуется меньше операций ввода-вывода. С другой стороны, требуется дополнительная обработка для восстановления данных (преобразования сжатых данных в исходный формат) после их выборки.&lt;br /&gt;
&lt;br /&gt;
Иначе говоря, тратим больше процессорного времени, в надежде потратить меньше времени для ввода/вывода (чаще всего окупается).&lt;br /&gt;
* Больше вычислений&lt;br /&gt;
* Меньше ввода-вывода&lt;br /&gt;
* Часто – быстрее&lt;br /&gt;
&lt;br /&gt;
В основе методов сжатия лежит тот факт, что значения данных почти никогда не бывают полностью случайными и характеризуются определенной степенью предсказуемости. В качестве простейшего примера можно указать, что если имя некоторого лица в файле имен и адресов начинается с буквы R, то весьма вероятно, что имя следующего лица также будет начинаться с буквы R, разумеется, при условии, что файл отсортирован по именам в алфавитном порядке.&lt;br /&gt;
&lt;br /&gt;
Мы можем прибегать к использованию структур данных, поскольку мы храним связанные записи, в частности у них одинаковая структура и т.д. &lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
* Сжатие по полям;&lt;br /&gt;
* Инкрементальное сжатие;&lt;br /&gt;
* Префиксное сжатие;&lt;br /&gt;
* Суффиксное сжатие;&lt;br /&gt;
* Кодирование [[Алгоритм Хаффмана|по методу Хаффмана]].&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Дейт К. Введение в системы баз данных (Приложение Г)''&lt;br /&gt;
* ''Кнут Д. Искусство программирования. Том 3. Сортировка и поиск''&lt;br /&gt;
* ''Silberschatz A., Korth H. F., Sudarshan S. Database System Concepts''&lt;br /&gt;
&lt;br /&gt;
[[Категория: Базы данных]]&lt;/div&gt;</summary>
		<author><name>188.170.80.235</name></author>	</entry>

	</feed>