Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных Шехтман.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
3 Мб
Скачать
☆

11.2. Организация индексов

11.2.1. Поиск в бд.

Файлы с прямым доступом, хэш-функции. Индексы.

11.2.2. Плотный индекс (индексно-прямые файлы).

Только первичные ключи. Ключ, № записи; записи упорядочены по значению ключа – можно применить бинарный поиск.

Важно не количество записей а количество блоков, которые надо просмотреть. Пусть длина записи – 128б, длина первичного ключа – 12б, количество записей – 100 000. Если длина блока – 1024б, то при 100 000 записей потребуется 3б, примем 4б. Длина записи индекса – 12+4, для этого требуется 100 000 / (1024/16) = 1563 блока. Максимальное количество обращений к диску – log21563=11, + 1 для доступа к записи данных.

Без индекса – 100000 / (1024 / 128) = 12500 блоков просмотреть в худшем случае. Для хранения индексов требуется выделить блоки в расчете на расширение данных.

При добавлении записи происходит запись в конец области данных. В индексной области необходимо записать новый элемент в конкретное место чтобы не нарушить упорядоченности. Эта область разбивается на блоки и при начальном заполнении каждый блок имеет резерв свободного места. После определения блока, в который надо занести элемнт, он копируется в ОЗУ, модифицируется, и записывается на диск. Резерв постоянно уменьшается. Когда он исчерпывается, надо либо перестроить всю индексную область, либо выделить область переполнения.

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

11.2.3. Неплотный индекс (индексно-последовательные файлы).

Если хранить основные данные в упорядоченном виде, то это позволит существенно сэкономить на поиске:

Log212500 = 14 - только для упорядоченных данных. Но поддержание данных в упорядоченном виде – сложная операция. Неплотный индекс – только для упорядоченного файла (кластерный индекс по терминологии MS SQL).

Ключ первой записи блока, № блока с записью

(теперь не 100000 записей, а 12500 блоков – 2 байта, длина индексной записи 12+2, количество инд. записей в блоке 1024 / 14 =73, количество блоков для хранения индекса – 12500 / 73 = 172, количество чтений диска при поиске – log 2172 = 8 + 1 для чтения данных.)

Ввод новой записи – в упорядоченную основную область, в ней – место для расширения.

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

11.2.4. Сбалансированные деревья.

B-tree (balanced tree) – идея построения индекса для уже построенного индекса.

Если построить неплотный индекс, то индексную область можно рассматривать как область данных, для которой можно построить неплотный индекс и т. д. В результате получим дерево, каждый родительский блок которого связан с одинаковым количеством подчиненных блоков, количество которых равно количеству индексных записей, размещаемых в одном блоке. Количество обращений к диску при этом для поиска любой записи одинаково и равно количеству уровней в построенном дереве – сбалансированном дереве. Сбалансированное дерево потому, что путь от корня до любого листа в этом дереве одинаков по длине.

1 уровень – 12500 блоков

2 уровень – 172 блока неплотного индекса

3 уровень – 172 / 73 = 3 блока

4 уровень – 1 блок

Число уровней – 4, число обращений к диску тоже. Это всегда, а не максимум.

Удаление и добавление записей такие же как для случая неплотного индекса.