Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_I_SUBD_Metodichka_2012.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
2.14 Mб
Скачать

Организация индексов в виде b-tree (в-деревьев)

Построение В-деревьев связано с идеей построения индекса над уже построенным индексом. Действительно, если мы построим неплотный индекс, то сама индексная область может быть рассмотрена нами как основной файл, над которым надо снова построить неплотный индекс, а потом снова над новым индексом строим следующий и так до того момента, пока не останется всего один индексный блок.

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

Построим подобное дерево для нашего примера и рассчитаем для него количество уровней и, соответственно, количество обращений к диску.

На первом уровне число блоков равно числу блоков основной области, т.е. 12 500 блоков. Второй уровень образуется из неплотного индекса, мы его тоже уже строили и вычислили, что количество блоков индексной области в этом случае равно 172 блокам. А теперь над этим вторым уровнем снова построим неплотный индекс.

Мы не будем менять длину индексной записи, а будем считать ее прежней, равной 14 байтам. Количество индексных записей в одном блоке нам тоже известно, и оно равно 73. Количество блоков для хранения ссылок на 172 блока: KIB3 = KIB2/KZIB = 172/73 = 3 блока.

И над третьим уровнем строим новый, и на нем будет всего один блок, в котором будет три записи. Поэтому число уровней в построенном дереве равно четырем, и соответственно количество обращений к диску для доступа к произвольной записи равно четырем. Это число обращений одинаковое (а не максимально возможное) для доступа к любой записи: Tд = Rуровн. = 4.

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

Инвертированные списки

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

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

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

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

На рисунке ниже представлен пример инвертированного списка, составленного для внешнего ключа "Номер группы" в списке студентов некоторого учебного заведения. Для более наглядного представления мы ограничили размер блока пятью записями (целыми числами).

Рис. 14.  Построение инвертированного списка по номеру группы для списка студентов

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

При модификации основного файла происходит следующая последовательность действий:

  • Изменяется запись основного файла.

  • Исключается старая ссылка на предыдущее значение внешнего ключа.

  • Добавляется новая ссылка на новое значение внешнего ключа.

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

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]