Цель лекции: дать представление об основных типовых способах организации данных в памяти ЭВМ в СУБД с оценкой соответствующих моделей по времени доступа к данным в базе данных и по объему занимаемой памяти.
Как уже отмечалось, концептуальная схема, специфицированная к СУБД, автоматически отображается в
Способы физической организации данных в различных СУБД, как правило, различны и определяются типом используемой ЭВМ, инструментальными средствами разработки СУБД, а также критериями, которыми руководствуются разработчики СУБД при выборе методов размещения данных и способов доступа к этим данным. Заметим, что наиболее распространенным критерием служит время доступа к данным, однако в качестве критерия может выбираться, например, трудоемкость реализации соответствующих методов.
В настоящей лекции будут рассмотрены типовые физические модели организации данных в конкретных СУБД.
Важнейшей особенностью памяти ЭВМ, в значительной степени определяющей методы организации данных и доступа к ним, является её неоднородность. Существуют два разных типа памяти – оперативная (ОП) и внешняя (ВП), причем процессор работает только с данными из оперативной памяти (рис 9.1.).
(рис 9.1) Схема работы ЭВМКак уже многократно отмечалось, базы данных создаются для работы с большими объемами данных, что обусловливает необходимость использования внешней памяти. Поэтому организация данных и доступа к ним должна учитывать как специфику каждого типа памяти, так и способы их взаимодействия.
Отметим основные свойства оперативной памяти:
Отметим основные свойства внешней памяти:
| Последовательность байтов ОП | ||||||||
|---|---|---|---|---|---|---|---|---|
| Поле 1 | Поле 2 | ... | Поле N | $$\to$$ | B1 |
B2 |
... | BN |
| Тип поля | Bi – последовательность байтов ОП, используемая для хранения поля i |
|||||||
| Характеристика поля | ||||||||
| Длина | ||||||||
Прямая адресация байтов позволяет процессору выбирать для обработки нужное поле.
Заметим, что указанное представление не делает различий для записей в сетевой, иерархической и реляционных моделях. В случае сетевой и
В большинстве современных СУБД используется формат записей фиксированной длины. В этом случае все записи имеют одинаковую длину, определяемую суммарной длиной полей, составляющих запись. В СУБД другие форматы записей (переменной длины, неопределенной длины) встречаются гораздо реже, поэтому в данной книге эти форматы не рассматриваются. Заметим, что поля записи, принимающие значения существенно разной длины в различных экземплярах записей, в предметной области встречаются достаточно часто. Примером может служить поле резюме в записи СОТРУДНИК. Резюме может составлять полстраницы текста, страницу и т.д. Возникает проблема – как эту информацию переменной длины представить в записи фиксированной длины. Возможным вариантом является установление размера соответствующего поля по максимальному значению. В этом случае у многих экземпляров записи указанное поле будет заполнено не полностью и, таким образом, память ЭВМ будет использоваться неэффективно. Более эффективный и часто используемый в СУБД прием организации таких записей состоит в следующем. Вместо поля (полей), принимающего значение существенно разной длины, в запись включается поле-указатель на область памяти, где будет размещаться значение исходного поля. Как правило, эта область является областью внешней памяти прямого доступа. В процессе ввода соответствующего значения в выделенной области занимается столько памяти, какова длина этого значения.
На рис 9.2 представлен пример вышеуказанного представления N полей, причем поле N принимает значения соответственно разной длины у разных
(рис 9.2) Представление полей переменной длиныКонкретной реализацией такой схемы является поле типа МЕМО в СУБД (dBase III+, FoxPro, Access и т.д.).
Единицей обмена данными между оперативной и внешней памятью является k экземпляров логических записей, составляющих
Ввод исходных данных в БД осуществляется следующим образом:
k экземпляров логических записей (кортежей);k экземпляров объединяются в Ввод .
(рис 9.3) Схема занесения записей во внешнюю памятьОбработка данных, хранящихся во внешней памяти, осуществляется следующим образом:
В некоторых СУБД (например, MS SQL Server) единицей обмена между оперативной и внешней памятью является страница (вид физической записи, размер которой фиксирован и не зависит от длины логической записи). Организация обмена между оперативной и внешней памятью в этом случае аналогична описанной выше. Отличие здесь будет состоять в том, что экземпляры логических записей формируются в буфере, размером со страницу (если размер страницы не кратен длине логической записи, страница может быть заполнена неполностью,
В современных СУБД наибольшее распространение получили
В качестве внешней памяти мы рассматриваем наиболее распространенную в современных ЭВМ память прямого доступа. Память прямого доступа дает возможность обращения к любой записи, если известен её адрес. Для упрощения изложения мы не будем конкретизировать ряд служебных полей, которые содержит
В этой структуре хранения записи в памяти размещаются последовательно друг за другом. Как уже отмечалось, считаем, что все записи имеют равную длину. Физический адрес записи может быть легко вычислен по номеру записи (для вычисления необходимо знать формат соответствующей физической записи).
I содержит логические записи с номерами
знаком $$\lceil N/k\rceil$$ обозначим ближайшее целое, большее или равное N/k, – целое сверху.
Рассмотрим, как реализуются основные элементарные операции модели данных в этой структуре хранения, и оценим число этих операций. Напомним, что с точки зрения пользователя в табличной модели данных эти операции являются операциями над строками (столбцами) таблицы.
При последовательной структуре хранения поиск может осуществляться только перебором. Читается первая k логических записей (разблокируется), заданное значение ключа сравнивается со значением ключа каждой логической записи. При несовпадении читается следующая
где N – число логических записей, k – коэффициент блокировки, $$\lceil N/k\rceil$$ – число физических записей.
Сначала необходимо найти нужную запись (смотри операцию "поиск"). После окончания операции "поиск" нужная запись уже считана в ОП. Число обращений к ВП равно ТР.
Сначала необходимо найти нужную запись (смотри операцию "поиск"). После окончания операции "поиск" в ОП найденная ТР+1.
Аналогична операции корректировки. Служебное поле соответствующей логической записи помечается как "удаленная запись". Число обращений к ВП равно ТР+1.
Рассмотрим два случая. В первом случае пользователь вводит новую k логических записей – блок неполон), для чего эта запись должна быть считана в ОП, или формируется новая
Во втором случае пользователь вводит новую i=1, 2, ..., n ). В этом случае читается k экземпляров логических записей исходной таблицы, читается
Если физические записи с номерами $$\lceil (i-1)/k\rceil$$ и $$\lceil i/k\rceil$$ содержат по k экземпляров исходных логических записей, необходимо формировать дополнительную k-1 пустых логических записей. Блоки с номерами $$\lceil i/k\rceil , \lceil (i+1)/k\rceil , \dots \lceil N/k\rceil$$ переписываются на одну позицию ниже (сдвигаются). Сформированная
В лучшем случае (i = N) ни один блок не сдвигается. В худшем случае (i = 1) сдвигаются все блоки. Среднее число обращений к ВП для перезаписи блоков (чтение + запись) составит $$2\lceil N/k\rceil /2$$. Тогда суммарное число обращений к ВП при добавлении записи в этом случае будет равно $$3+\lceil N/k\rceil$$.
Заметим, что если записи упорядочены по значениям ключа поиск может производиться дихотомическим методом и число обращений к внешней памяти будет пропорционально не $$(1+\lceil N/k\rceil )/2,$$ а $$log_{2}\lceil N/k\rceil ,$$ т.е. существенно меньше. Однако добавление записи потребует для сохранения упорядоченности, как правило, сдвига большого числа записей. Поэтому размещение физических записей с упорядочением их по значениям ключа в СУБД не используется.
Основная проблема в использовании изложенного в п. 9.4.1 способа организации записей состоит в отображении добавления логической записи в произвольное место таблицы. При этом приходится переписывать в памяти (сдвигать на одну позицию) физические записи, соответствующие логическим записям таблицы, расположенным ниже места вставки добавляемой строки. Соответствующую проблему можно устранить, используя для представления физических записей связный список (рис 9.4).
(рис 9.4) Список физических записейКроме этого списка в ВП формируется список свободных элементов ("пустых" физических записей), элементы которого используются при вводе новой записи с данными (рис 9.5).
Напомним, что каждая k логических записей.
(рис 9.5) Список свободных элементовРассмотрим, как реализуются основные элементарные операции модели данных в этой структуре хранения.
Заметим, что упорядочение записей по значениям ключа не дает здесь ускорения процедуры поиска. Это связано с тем, что после ряда добавлений новых записей и удаления каких-то имеющихся записей физическая и логическая последовательность записей в списке будут существенно различаться. При этом будет невозможно по номеру записи определить ее адрес и обращаться к записи, соответствующей середине таблицы, для реализации дихотомического метода поиска. Поэтому поиск можно вести только с помощью перебора. В ОП читается первая запись списка, разблокируется, значения ключевых полей логических записей этой физической записи сравниваются с заданным значением. Если значения совпали, нужная запись найдена, если не совпали, из записи выбирается адрес следующей записи списка, читается эта запись. Далее процедура повторяется. Среднее число обращений к ВП будет равно, как и в 9.4.1, $$(1+\lceil N/k\rceil )/2$$.
После завершения предыдущей операции запись считана в ОП. Оценка числа обращений к ВП та же.
Считанная запись корректируется и заносится в ВП на свое место (по своему адресу). Число обращений к ВП на единицу больше, чем при чтении.
Заметим, что мы говорим об операциях над логическими записями. Операция удаления логической записи аналогична операции корректировки. Служебное поле соответствующей логической записи помечается как "удаленная запись". Сформированная ТР+1.
Для определенности будем считать, что задан ключ логической записи, после которой должна быть добавлена новая запись. Осуществляется операция поиска и чтения физической записи, в которой расположена запись с ключом РК. Если в этом блоке есть ТР+1. Если в этом блоке нет логических записей, помеченных как удаленные, необходимо добавлять новую
Читается первая ТР+3.
Рассмотренный метод организации
Как уже отмечалось, упорядочение записей позволяет использовать дихотомический метод поиска нужной записи и тем самым существенно сократить одну из основных составляющих времени поиска – число обращений к ВП. Однако при этом возникают проблемы с добавлением записей, связанные с необходимостью перезаписи части физических записей (сдвига).
Для того чтобы использовать дихотомический поиск и не перемещать физические записи при добавлении новых записей, используется так называемое логическое упорядочение физических записей (
Записи индекса (индексного файла) упорядочены по значению ключа. Адреса связи этих записей определяют логическое упорядочение записей основной
Рассматриваемую
(рис 9.6) ИндексированиеПоиск нужной записи по заданному значению ключа осуществляется в индексном файле
Оценим число обращений к ВП при реализации элементарных операций. Соответствующие оценки сделаны для случая, когда k равен 1). Расчет оценок для произвольного k производится по аналогии с расчетами пп. 9.4.1–9.4.2.
Из ВП читается индексный файл (число обращений к ВП для этого зависит от объема индексного файла, как правило, невелико и много меньше числа записей N ). После нахождения нужной записи в индексном файле читается соответствующая запись основного файла (одно обращение к ВП).
В ходе операции поиска искомая запись считана в ОП.
Считанная запись корректируется и заносится на свое место (еще одно обращение к ВП).
Найденная запись помечается как удаленная в основном файле, соответствующая запись в индексном файле удаляется, измененный индекс записывается в ВП. Число обращений к ВП в этом случае по сравнению с числом обращений к ВП при поиске увеличивается на два.
Добавляемая запись заносится в конец основного файла. Формируется новая запись индекса, соответствующая добавляемой записи. Записи индекса переупорядочиваются по значениям ключа, и индекс заносится в ВП. Число обращений к ВП в этом случае, в основном, определяется чтением-записью индекса.
Таким образом, использование индексов позволяет ценой некоторого увеличения объема используемой памяти (за счет индекса) существенно сократить время реализации основных операций. В связи с этим
Структура
k записей в блоках).
Значением ключа блока является минимальное значение ключа у записей, входящих в блок. Последовательность блоков представляет собой последний уровень k записей). Затем аналогично строится индекс более высокого уровня и т.д., пока количество записей индекса на определенном уровне будет не более k.
Рассмотрим процедуру работы с B-деревом на примере. Пусть имеется файл экземпляров логических записей, ключи которых принимают значения 2, 7, 8, 12, 15, 27, 28, 40, 43, 50. Для определенности возьмем (для упрощения рисунка на уровне 4 представлены только ключи логических записей и не представлены значения других полей этих записей).
(рис 9.7) В-деревоВ блоках указано значение ключа соответствующего блока. Значение k принято равным 2.
По построению
Рассмотрим реализацию основных операций.
Читается верхний индекс. Сравниваем заданное значение ключа со значением ключа последней записи индекса. Если заданное значение ключа больше, чем значение ключа очередной записи индекса (если такая запись имеется), или равно ему, то по адресу связи, указанному в текущей записи, читается блок записей индекса следующего уровня. Далее процесс повторяется.
Считаем, что все блоки расположены в ВП. Тогда число обращений к ВП при поиске информации будет равно числу уровней дерева. Число уровней дерева равно минимальному значению l, при котором выполняется условие kl >= N ( N – число логических записей).
После поиска и чтения записи изменяются корректируемые поля. Если корректируется не ключ записи, то измененная запись заносится на свое место. Если изменено значение ключа, то старая запись удаляется (в соответствующем блоке появляется "пустая" запись), а измененная запись заносится так же, как вновь добавляемая.
После поиска найденная запись удаляется (в соответствующий блок на место этой записи заносится "пустая" запись).
Прежде всего определяется, где должна быть расположена добавляемая запись с заданным значением ключа. Процедура поиска блока, где должна быть расположена эта запись, аналогична вышеописанной процедуре поиска записей с заданным значением ключа. Если в найденном блоке низшего уровня есть "пустая" запись, добавляемая запись заносится в этот блок (с необходимым переупорядочением записей внутри блока).
Если в соответствующем блоке низшего уровня нет пустого места, блок делится на два блока. В первый из них заносится [k/2] записей, во второй заносятся остальные. Значением ключа каждого из указанных блоков будет являться, как и описано ранее, минимальное значение ключей у записей, входящих в блок. Добавляемая запись заносится в тот блок, значение ключа которого меньше значения ключа добавляемой записи. Появление нового блока с новым значением ключа обусловливает необходимость формирования соответствующей новой записи в индексе на предыдущем уровне. Эта запись содержит новое значение ключа нового блока и указатель на его месторасположение. Процедура добавления такой записи аналогична описанной выше. Находится блок предыдущего уровня, куда должна быть помещена эта запись. Если в блоке есть пустое место, запись добавляется в блок, если блок полон, он делится на два блока, запись заносится в один из блоков, формируется запись индекса предыдущего уровня и т.д.
Возможен вариант, когда придется делить блок самого верхнего уровня и формировать еще один уровень дерева.
Рассмотрим для примера, изображенного на рис 9.7, добавление записи с ключом 10.
1. Сравнение на первом уровне.
2<10<43
Движение по левой ветви.
2. Сравнение на втором уровне.
2<10<15
Движение по левой ветви.
3. Сравнение на третьем уровне.
2<8<10
Движение по правой ветви.
Искомый блок
4. Блок заполнен.
Он делится на 2 блока


Сравнение 8<10<12.
Запись с ключом 10 заносится в блок 1


На низшем уровне появилась новая запись с значением ключа 12. Необходимо добавление новой записи с ключом 12 и указателем на запись низшего уровня к индексу предыдущего уровня.
5. Запись с ключом 12 уровня 3 должна добавляться в блок
. Блок полон, он делится на два блока


Сравнение 8<12.
Запись добавляется во второй блок
6. На уровне 3 появился блок с новым ключом 8. Необходимо добавление новой записи с ключом 8 и указателем на соответствующий блок уровня 3 на уровне 2.
7. Запись с ключом 8 уровня 2 должна добавиться в блок
. Блок полон, он делится на два блока.


2<8<15
Запись добавляется в блок 1
.
8. На уровне 2 появился блок с новым ключом 15, необходимо добавление новой записи с ключом 15 и указателем на соответствующий блок уровня 2 на уровне 1.
9. Запись с ключом 15 уровня 1 должна добавляться в блок
. Блок полон, он делится на два блока.


2<15<43
Запись с ключом 15 добавляется в первый блок


10. Необходимо сформировать еще один уровень дерева
.
Полученная структура будет иметь вид, представленный на рис 9.8.
(рис 9.8) В-дерево после добавления элементаНеобходимо заметить, что используемый прием деления пополам полностью заполненного блока при добавлении в него записи приведет к тому, что блоки будут заполнены, в среднем, наполовину. Тогда процедура добавления записи будет существенно менее трудоемкой (если в нужном блоке есть место, запись добавляется в этот блок и вышестоящие уровни не перестраиваются).
Процедура добавления записи тоже достаточно эффективна. Соответствующая
Как в любом другом способе организации k штук. Однако в отличие от всех других способов организации f. Аргументом этой функции является значение x первичного ключа логической записи. Тогда f(x) указывает адрес расположения блока, в котором должна находиться логическая запись со значением ключа x.
Функция f должна, по возможности, равномерно распределять значения x по физическим блокам. Обсуждению возможных x первичного ключа, можно построить функцию f, удовлетворяющую всем необходимым условиям. Таким образом, x первичного ключа размещается в блоке внешней памяти по адресу f(x). В этом блоке может находиться не более k записей. Может оказаться, что выбранная функция отображает в один адрес памяти (один блок) более k записей.
Возникает так называемая коллизия. Возможным способом разрешения коллизий является использование дополнительной области переполнения следующим образом. Если очередная запись распределяется с помощью функции хэширования в блок, а он полностью заполнен, то в области переполнения формируется список записей, соответствующих этому блоку, с включением в него указанной записи, а в сам блок заносится указатель – адрес связи на первую запись этого списка. Возможны и другие способы разрешения коллизий.
Рассмотрим реализацию основных операций и дадим оценку числа обращений к ВП при их выполнении.
По заданному значению ключа x подсчитывается значение функции f(x). Далее из ВП считывается блок, находящийся по адресу f(x). В ОП внутри этого блока перебором ищется нужная запись. Если записей в блоке нет, то по указателю в блоке (адресу связи) читается первая запись списка переполнения, относящаяся к этому блоку. Далее необходимая запись ищется по этому списку. Число обращений к ВП при этом равно:
Осуществляется поиск и чтение записи, затем в ОП модифицируются поля записи (не являющиеся первичным ключом), запись заносится на свое место. Число обращений к ВП в этом случае на единицу больше, чем при чтении записи. Если модифицируется значение ключа, то занесение записи осуществляется как ввод новой записи (добавление).
Осуществляется поиск и чтение записи. Если удаляемая запись находилась в блоке основной памяти, на ее место заносится "пустая" запись (или признак "пустой" записи). Если удаляемая запись находилась в списке области переполнения, удаление ее производится по правилам удаления элемента списка. Число обращений к ВП при удалении находится примерно в тех же пределах, что и для предыдущих операций.
При добавлении записи со значением ключа x подсчитывается адрес соответствующего блока f(x). Блок считывается в ОП. Если в нем есть место, запись заносится в блок, блок записывается в ВП по своему адресу. Если блок заполнен, из него выбирается адрес начала списка записей, переполняющих блок. Далее добавление записи в список производится по правилам добавления элемента в список. Число обращений к ВП при добавлении записей находится примерно в тех же пределах, что и для предыдущих операций.
Таким образом, описанная
Необходимо заметить, что в СУБД могут использоваться как каждая из вышерассмотренных структур в отдельности, так и их комбинация. Так, например, в ряде промышленных систем UNIBAD, БАНК для ЭВМ типа IBM 360/370 (ЕС ЭВМ), PARADOX для персональных ЭВМ используются следующие комбинации методов:
Краткие итоги: Лекция посвящена вопросам физической организации данных в памяти компьютера (организации
Более подробно с материалами этой лекции можно ознакомиться в [-].
Цель лекции: дать представление об основных типовых способах организации данных в памяти ЭВМ в СУБД с оценкой соответствующих моделей по времени доступа к данным в базе данных и по объему занимаемой памяти.
Как уже отмечалось, концептуальная схема, специфицированная к СУБД, автоматически отображается в
Способы физической организации данных в различных СУБД, как правило, различны и определяются типом используемой ЭВМ, инструментальными средствами разработки СУБД, а также критериями, которыми руководствуются разработчики СУБД при выборе методов размещения данных и способов доступа к этим данным. Заметим, что наиболее распространенным критерием служит время доступа к данным, однако в качестве критерия может выбираться, например, трудоемкость реализации соответствующих методов.
В настоящей лекции будут рассмотрены типовые физические модели организации данных в конкретных СУБД.
Важнейшей особенностью памяти ЭВМ, в значительной степени определяющей методы организации данных и доступа к ним, является её неоднородность. Существуют два разных типа памяти – оперативная (ОП) и внешняя (ВП), причем процессор работает только с данными из оперативной памяти (рис 9.1.).
(рис 9.1) Схема работы ЭВМКак уже многократно отмечалось, базы данных создаются для работы с большими объемами данных, что обусловливает необходимость использования внешней памяти. Поэтому организация данных и доступа к ним должна учитывать как специфику каждого типа памяти, так и способы их взаимодействия.
Отметим основные свойства оперативной памяти:
Отметим основные свойства внешней памяти:
| Последовательность байтов ОП | ||||||||
|---|---|---|---|---|---|---|---|---|
| Поле 1 | Поле 2 | ... | Поле N | $$\to$$ | B1 |
B2 |
... | BN |
| Тип поля | Bi – последовательность байтов ОП, используемая для хранения поля i |
|||||||
| Характеристика поля | ||||||||
| Длина | ||||||||
Прямая адресация байтов позволяет процессору выбирать для обработки нужное поле.
Заметим, что указанное представление не делает различий для записей в сетевой, иерархической и реляционных моделях. В случае сетевой и
В большинстве современных СУБД используется формат записей фиксированной длины. В этом случае все записи имеют одинаковую длину, определяемую суммарной длиной полей, составляющих запись. В СУБД другие форматы записей (переменной длины, неопределенной длины) встречаются гораздо реже, поэтому в данной книге эти форматы не рассматриваются. Заметим, что поля записи, принимающие значения существенно разной длины в различных экземплярах записей, в предметной области встречаются достаточно часто. Примером может служить поле резюме в записи СОТРУДНИК. Резюме может составлять полстраницы текста, страницу и т.д. Возникает проблема – как эту информацию переменной длины представить в записи фиксированной длины. Возможным вариантом является установление размера соответствующего поля по максимальному значению. В этом случае у многих экземпляров записи указанное поле будет заполнено не полностью и, таким образом, память ЭВМ будет использоваться неэффективно. Более эффективный и часто используемый в СУБД прием организации таких записей состоит в следующем. Вместо поля (полей), принимающего значение существенно разной длины, в запись включается поле-указатель на область памяти, где будет размещаться значение исходного поля. Как правило, эта область является областью внешней памяти прямого доступа. В процессе ввода соответствующего значения в выделенной области занимается столько памяти, какова длина этого значения.
На рис 9.2 представлен пример вышеуказанного представления N полей, причем поле N принимает значения соответственно разной длины у разных
(рис 9.2) Представление полей переменной длиныКонкретной реализацией такой схемы является поле типа МЕМО в СУБД (dBase III+, FoxPro, Access и т.д.).
Единицей обмена данными между оперативной и внешней памятью является k экземпляров логических записей, составляющих
Ввод исходных данных в БД осуществляется следующим образом:
k экземпляров логических записей (кортежей);k экземпляров объединяются в Ввод .
(рис 9.3) Схема занесения записей во внешнюю памятьОбработка данных, хранящихся во внешней памяти, осуществляется следующим образом:
В некоторых СУБД (например, MS SQL Server) единицей обмена между оперативной и внешней памятью является страница (вид физической записи, размер которой фиксирован и не зависит от длины логической записи). Организация обмена между оперативной и внешней памятью в этом случае аналогична описанной выше. Отличие здесь будет состоять в том, что экземпляры логических записей формируются в буфере, размером со страницу (если размер страницы не кратен длине логической записи, страница может быть заполнена неполностью,
В современных СУБД наибольшее распространение получили
В качестве внешней памяти мы рассматриваем наиболее распространенную в современных ЭВМ память прямого доступа. Память прямого доступа дает возможность обращения к любой записи, если известен её адрес. Для упрощения изложения мы не будем конкретизировать ряд служебных полей, которые содержит
В этой структуре хранения записи в памяти размещаются последовательно друг за другом. Как уже отмечалось, считаем, что все записи имеют равную длину. Физический адрес записи может быть легко вычислен по номеру записи (для вычисления необходимо знать формат соответствующей физической записи).
I содержит логические записи с номерами
знаком $$\lceil N/k\rceil$$ обозначим ближайшее целое, большее или равное N/k, – целое сверху.
Рассмотрим, как реализуются основные элементарные операции модели данных в этой структуре хранения, и оценим число этих операций. Напомним, что с точки зрения пользователя в табличной модели данных эти операции являются операциями над строками (столбцами) таблицы.
При последовательной структуре хранения поиск может осуществляться только перебором. Читается первая k логических записей (разблокируется), заданное значение ключа сравнивается со значением ключа каждой логической записи. При несовпадении читается следующая
где N – число логических записей, k – коэффициент блокировки, $$\lceil N/k\rceil$$ – число физических записей.
Сначала необходимо найти нужную запись (смотри операцию "поиск"). После окончания операции "поиск" нужная запись уже считана в ОП. Число обращений к ВП равно ТР.
Сначала необходимо найти нужную запись (смотри операцию "поиск"). После окончания операции "поиск" в ОП найденная ТР+1.
Аналогична операции корректировки. Служебное поле соответствующей логической записи помечается как "удаленная запись". Число обращений к ВП равно ТР+1.
Рассмотрим два случая. В первом случае пользователь вводит новую k логических записей – блок неполон), для чего эта запись должна быть считана в ОП, или формируется новая
Во втором случае пользователь вводит новую i=1, 2, ..., n ). В этом случае читается k экземпляров логических записей исходной таблицы, читается
Если физические записи с номерами $$\lceil (i-1)/k\rceil$$ и $$\lceil i/k\rceil$$ содержат по k экземпляров исходных логических записей, необходимо формировать дополнительную k-1 пустых логических записей. Блоки с номерами $$\lceil i/k\rceil , \lceil (i+1)/k\rceil , \dots \lceil N/k\rceil$$ переписываются на одну позицию ниже (сдвигаются). Сформированная
В лучшем случае (i = N) ни один блок не сдвигается. В худшем случае (i = 1) сдвигаются все блоки. Среднее число обращений к ВП для перезаписи блоков (чтение + запись) составит $$2\lceil N/k\rceil /2$$. Тогда суммарное число обращений к ВП при добавлении записи в этом случае будет равно $$3+\lceil N/k\rceil$$.
Заметим, что если записи упорядочены по значениям ключа поиск может производиться дихотомическим методом и число обращений к внешней памяти будет пропорционально не $$(1+\lceil N/k\rceil )/2,$$ а $$log_{2}\lceil N/k\rceil ,$$ т.е. существенно меньше. Однако добавление записи потребует для сохранения упорядоченности, как правило, сдвига большого числа записей. Поэтому размещение физических записей с упорядочением их по значениям ключа в СУБД не используется.
Основная проблема в использовании изложенного в п. 9.4.1 способа организации записей состоит в отображении добавления логической записи в произвольное место таблицы. При этом приходится переписывать в памяти (сдвигать на одну позицию) физические записи, соответствующие логическим записям таблицы, расположенным ниже места вставки добавляемой строки. Соответствующую проблему можно устранить, используя для представления физических записей связный список (рис 9.4).
(рис 9.4) Список физических записейКроме этого списка в ВП формируется список свободных элементов ("пустых" физических записей), элементы которого используются при вводе новой записи с данными (рис 9.5).
Напомним, что каждая k логических записей.
(рис 9.5) Список свободных элементовРассмотрим, как реализуются основные элементарные операции модели данных в этой структуре хранения.
Заметим, что упорядочение записей по значениям ключа не дает здесь ускорения процедуры поиска. Это связано с тем, что после ряда добавлений новых записей и удаления каких-то имеющихся записей физическая и логическая последовательность записей в списке будут существенно различаться. При этом будет невозможно по номеру записи определить ее адрес и обращаться к записи, соответствующей середине таблицы, для реализации дихотомического метода поиска. Поэтому поиск можно вести только с помощью перебора. В ОП читается первая запись списка, разблокируется, значения ключевых полей логических записей этой физической записи сравниваются с заданным значением. Если значения совпали, нужная запись найдена, если не совпали, из записи выбирается адрес следующей записи списка, читается эта запись. Далее процедура повторяется. Среднее число обращений к ВП будет равно, как и в 9.4.1, $$(1+\lceil N/k\rceil )/2$$.
После завершения предыдущей операции запись считана в ОП. Оценка числа обращений к ВП та же.
Считанная запись корректируется и заносится в ВП на свое место (по своему адресу). Число обращений к ВП на единицу больше, чем при чтении.
Заметим, что мы говорим об операциях над логическими записями. Операция удаления логической записи аналогична операции корректировки. Служебное поле соответствующей логической записи помечается как "удаленная запись". Сформированная ТР+1.
Для определенности будем считать, что задан ключ логической записи, после которой должна быть добавлена новая запись. Осуществляется операция поиска и чтения физической записи, в которой расположена запись с ключом РК. Если в этом блоке есть ТР+1. Если в этом блоке нет логических записей, помеченных как удаленные, необходимо добавлять новую
Читается первая ТР+3.
Рассмотренный метод организации
Как уже отмечалось, упорядочение записей позволяет использовать дихотомический метод поиска нужной записи и тем самым существенно сократить одну из основных составляющих времени поиска – число обращений к ВП. Однако при этом возникают проблемы с добавлением записей, связанные с необходимостью перезаписи части физических записей (сдвига).
Для того чтобы использовать дихотомический поиск и не перемещать физические записи при добавлении новых записей, используется так называемое логическое упорядочение физических записей (
Записи индекса (индексного файла) упорядочены по значению ключа. Адреса связи этих записей определяют логическое упорядочение записей основной
Рассматриваемую
(рис 9.6) ИндексированиеПоиск нужной записи по заданному значению ключа осуществляется в индексном файле
Оценим число обращений к ВП при реализации элементарных операций. Соответствующие оценки сделаны для случая, когда k равен 1). Расчет оценок для произвольного k производится по аналогии с расчетами пп. 9.4.1–9.4.2.
Из ВП читается индексный файл (число обращений к ВП для этого зависит от объема индексного файла, как правило, невелико и много меньше числа записей N ). После нахождения нужной записи в индексном файле читается соответствующая запись основного файла (одно обращение к ВП).
В ходе операции поиска искомая запись считана в ОП.
Считанная запись корректируется и заносится на свое место (еще одно обращение к ВП).
Найденная запись помечается как удаленная в основном файле, соответствующая запись в индексном файле удаляется, измененный индекс записывается в ВП. Число обращений к ВП в этом случае по сравнению с числом обращений к ВП при поиске увеличивается на два.
Добавляемая запись заносится в конец основного файла. Формируется новая запись индекса, соответствующая добавляемой записи. Записи индекса переупорядочиваются по значениям ключа, и индекс заносится в ВП. Число обращений к ВП в этом случае, в основном, определяется чтением-записью индекса.
Таким образом, использование индексов позволяет ценой некоторого увеличения объема используемой памяти (за счет индекса) существенно сократить время реализации основных операций. В связи с этим
Структура
k записей в блоках).
Значением ключа блока является минимальное значение ключа у записей, входящих в блок. Последовательность блоков представляет собой последний уровень k записей). Затем аналогично строится индекс более высокого уровня и т.д., пока количество записей индекса на определенном уровне будет не более k.
Рассмотрим процедуру работы с B-деревом на примере. Пусть имеется файл экземпляров логических записей, ключи которых принимают значения 2, 7, 8, 12, 15, 27, 28, 40, 43, 50. Для определенности возьмем (для упрощения рисунка на уровне 4 представлены только ключи логических записей и не представлены значения других полей этих записей).
(рис 9.7) В-деревоВ блоках указано значение ключа соответствующего блока. Значение k принято равным 2.
По построению
Рассмотрим реализацию основных операций.
Читается верхний индекс. Сравниваем заданное значение ключа со значением ключа последней записи индекса. Если заданное значение ключа больше, чем значение ключа очередной записи индекса (если такая запись имеется), или равно ему, то по адресу связи, указанному в текущей записи, читается блок записей индекса следующего уровня. Далее процесс повторяется.
Считаем, что все блоки расположены в ВП. Тогда число обращений к ВП при поиске информации будет равно числу уровней дерева. Число уровней дерева равно минимальному значению l, при котором выполняется условие kl >= N ( N – число логических записей).
После поиска и чтения записи изменяются корректируемые поля. Если корректируется не ключ записи, то измененная запись заносится на свое место. Если изменено значение ключа, то старая запись удаляется (в соответствующем блоке появляется "пустая" запись), а измененная запись заносится так же, как вновь добавляемая.
После поиска найденная запись удаляется (в соответствующий блок на место этой записи заносится "пустая" запись).
Прежде всего определяется, где должна быть расположена добавляемая запись с заданным значением ключа. Процедура поиска блока, где должна быть расположена эта запись, аналогична вышеописанной процедуре поиска записей с заданным значением ключа. Если в найденном блоке низшего уровня есть "пустая" запись, добавляемая запись заносится в этот блок (с необходимым переупорядочением записей внутри блока).
Если в соответствующем блоке низшего уровня нет пустого места, блок делится на два блока. В первый из них заносится [k/2] записей, во второй заносятся остальные. Значением ключа каждого из указанных блоков будет являться, как и описано ранее, минимальное значение ключей у записей, входящих в блок. Добавляемая запись заносится в тот блок, значение ключа которого меньше значения ключа добавляемой записи. Появление нового блока с новым значением ключа обусловливает необходимость формирования соответствующей новой записи в индексе на предыдущем уровне. Эта запись содержит новое значение ключа нового блока и указатель на его месторасположение. Процедура добавления такой записи аналогична описанной выше. Находится блок предыдущего уровня, куда должна быть помещена эта запись. Если в блоке есть пустое место, запись добавляется в блок, если блок полон, он делится на два блока, запись заносится в один из блоков, формируется запись индекса предыдущего уровня и т.д.
Возможен вариант, когда придется делить блок самого верхнего уровня и формировать еще один уровень дерева.
Рассмотрим для примера, изображенного на рис 9.7, добавление записи с ключом 10.
1. Сравнение на первом уровне.
2<10<43
Движение по левой ветви.
2. Сравнение на втором уровне.
2<10<15
Движение по левой ветви.
3. Сравнение на третьем уровне.
2<8<10
Движение по правой ветви.
Искомый блок
4. Блок заполнен.
Он делится на 2 блока


Сравнение 8<10<12.
Запись с ключом 10 заносится в блок 1


На низшем уровне появилась новая запись с значением ключа 12. Необходимо добавление новой записи с ключом 12 и указателем на запись низшего уровня к индексу предыдущего уровня.
5. Запись с ключом 12 уровня 3 должна добавляться в блок
. Блок полон, он делится на два блока


Сравнение 8<12.
Запись добавляется во второй блок
6. На уровне 3 появился блок с новым ключом 8. Необходимо добавление новой записи с ключом 8 и указателем на соответствующий блок уровня 3 на уровне 2.
7. Запись с ключом 8 уровня 2 должна добавиться в блок
. Блок полон, он делится на два блока.


2<8<15
Запись добавляется в блок 1
.
8. На уровне 2 появился блок с новым ключом 15, необходимо добавление новой записи с ключом 15 и указателем на соответствующий блок уровня 2 на уровне 1.
9. Запись с ключом 15 уровня 1 должна добавляться в блок
. Блок полон, он делится на два блока.


2<15<43
Запись с ключом 15 добавляется в первый блок


10. Необходимо сформировать еще один уровень дерева
.
Полученная структура будет иметь вид, представленный на рис 9.8.
(рис 9.8) В-дерево после добавления элементаНеобходимо заметить, что используемый прием деления пополам полностью заполненного блока при добавлении в него записи приведет к тому, что блоки будут заполнены, в среднем, наполовину. Тогда процедура добавления записи будет существенно менее трудоемкой (если в нужном блоке есть место, запись добавляется в этот блок и вышестоящие уровни не перестраиваются).
Процедура добавления записи тоже достаточно эффективна. Соответствующая
Как в любом другом способе организации k штук. Однако в отличие от всех других способов организации f. Аргументом этой функции является значение x первичного ключа логической записи. Тогда f(x) указывает адрес расположения блока, в котором должна находиться логическая запись со значением ключа x.
Функция f должна, по возможности, равномерно распределять значения x по физическим блокам. Обсуждению возможных x первичного ключа, можно построить функцию f, удовлетворяющую всем необходимым условиям. Таким образом, x первичного ключа размещается в блоке внешней памяти по адресу f(x). В этом блоке может находиться не более k записей. Может оказаться, что выбранная функция отображает в один адрес памяти (один блок) более k записей.
Возникает так называемая коллизия. Возможным способом разрешения коллизий является использование дополнительной области переполнения следующим образом. Если очередная запись распределяется с помощью функции хэширования в блок, а он полностью заполнен, то в области переполнения формируется список записей, соответствующих этому блоку, с включением в него указанной записи, а в сам блок заносится указатель – адрес связи на первую запись этого списка. Возможны и другие способы разрешения коллизий.
Рассмотрим реализацию основных операций и дадим оценку числа обращений к ВП при их выполнении.
По заданному значению ключа x подсчитывается значение функции f(x). Далее из ВП считывается блок, находящийся по адресу f(x). В ОП внутри этого блока перебором ищется нужная запись. Если записей в блоке нет, то по указателю в блоке (адресу связи) читается первая запись списка переполнения, относящаяся к этому блоку. Далее необходимая запись ищется по этому списку. Число обращений к ВП при этом равно:
Осуществляется поиск и чтение записи, затем в ОП модифицируются поля записи (не являющиеся первичным ключом), запись заносится на свое место. Число обращений к ВП в этом случае на единицу больше, чем при чтении записи. Если модифицируется значение ключа, то занесение записи осуществляется как ввод новой записи (добавление).
Осуществляется поиск и чтение записи. Если удаляемая запись находилась в блоке основной памяти, на ее место заносится "пустая" запись (или признак "пустой" записи). Если удаляемая запись находилась в списке области переполнения, удаление ее производится по правилам удаления элемента списка. Число обращений к ВП при удалении находится примерно в тех же пределах, что и для предыдущих операций.
При добавлении записи со значением ключа x подсчитывается адрес соответствующего блока f(x). Блок считывается в ОП. Если в нем есть место, запись заносится в блок, блок записывается в ВП по своему адресу. Если блок заполнен, из него выбирается адрес начала списка записей, переполняющих блок. Далее добавление записи в список производится по правилам добавления элемента в список. Число обращений к ВП при добавлении записей находится примерно в тех же пределах, что и для предыдущих операций.
Таким образом, описанная
Необходимо заметить, что в СУБД могут использоваться как каждая из вышерассмотренных структур в отдельности, так и их комбинация. Так, например, в ряде промышленных систем UNIBAD, БАНК для ЭВМ типа IBM 360/370 (ЕС ЭВМ), PARADOX для персональных ЭВМ используются следующие комбинации методов:
Краткие итоги: Лекция посвящена вопросам физической организации данных в памяти компьютера (организации
Более подробно с материалами этой лекции можно ознакомиться в [-].
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.