Лекции и практики (1). Курс лекций и материалы для практических занятий
![]()
|
Способы организации индексовСуществует множество способов организации индексов: В плотных индексах для каждого значения ключа имеется отдельная запись индекса, указывающая место размещения конкретной записи. Неплотные (разреженные) индексы строятся в предположении, что на каждой странице памяти хранятся записи, отсортированные по значениям индексируемого ат- рибута. Тогда для каждой страницы в индексе задаётся диапазон значений ключей хранимых в ней записей, и поиск записи осуществляется среди запи- сей на указанной странице. ![]() ![]() Одноуровневый индекс представляет собой линейную совокупность значе- ний одного или нескольких полей записи. На практике он используется ред- ко. В развитых СУБД применяются более сложные методы организации ин- дексов. Особенно эффективными являются многоуровневые индексы в ви- де сбалансированных деревьев (B-деревьев, balance trees). Многоуровневые индексы на основе В-дерева![]() ![]() Рис. 5.5. Пример построения B-дерева порядка 3 ![]() Все конечные вершины расположены на одном уровне, т.е. длина пути от корня к любой конечной вершине одинакова. Каждая вершина может содержать n адресных ссылок и (n-1) ключей. Ссыл- ка влево от ключа обеспечивает переход к вершине дерева с меньшими зна- чениями ключей, а вправо – к вершине с большими значениями. Любая неконечная вершина имеет не менее n/2 подчинённых вершин. (Для деревьев нечётного порядка значение n/2 округляется в большую сторону). Если неконечная вершина содержит k (k Алгоритм формирования B-дерева порядка n предполагает, что сначала заполняется корневая вершина. Затем при появлении новой записи корневая вершина делится, образуются подчинённые ей вершины. При запоминании каждой новой записи поиск места для неё начинается с корневой вершины. Ес- ли в существующем на данный момент B-дереве нет места для размещения но- вого ключа, происходит сдвиг ключей вправо или влево, если это невозможно – осуществляется перестройка дерева. ![]() ![]() Рис. 5.6. Пример индексного блока СУБД Oracle Организация индексов в СУБД Oracle несколько отличается от рассмот- ренной выше классической организации B-дерева, но принцип остаётся тот же: одинаковое количество уровней на любом пути и автоматическая сбалансиро- ванность. Верхние блоки индекса содержат автоматически вычисляемые значе- ния, которые позволяют осуществлять поиск данных. Предпоследний (n-1)-й уровень содержит значения индексируемого поля (атрибута) без повторов (т.е. каждое значение один раз). Самый нижний n-й уровень – блоки-листья, кото- рые содержат индексируемые значения и соответствующие идентификаторы записей RowID (row identification, КБД), используемые для нахождения самих записей. Для неуникальных индексов значения идентификаторов строк (RowID) в блоках-листьях индекса также отсортированы по возрастанию. Блоки-листья связаны между собой двунаправленными ссылками. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() При обнаружении значения искомого ключа в блоке индекса происходит обращение к диску по RowID и извлечение требуемой записи (записей). Если же значение не обнаружено, результат поиска пуст. ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Рис. 5.7. Пример перераспределения данных индексного блока СУБД Oracle ![]() ![]() ![]() ![]() Структура B-дерева имеет следующие преимущества: Все блоки-листья в дереве расположены на одном уровне, следовательно, поиск любой записи в индексе занимает примерно одно и то же время. B-дерево автоматически поддерживается в сбалансированном виде. B-деревья обеспечивают хорошую производительность для широкого спек- тра запросов, включая поиск по конкретному значению и поиск в открытом и закрытом интервалах (благодаря ссылкам между блоками-листьями). Модификация данных таблицы выполняется достаточно эффективно, т.к. в блоках индекса обычно есть свободное место для размещения новых значе- ний, а полная перестройка дерева выполняется достаточно редко. Производительность B-дерева одинаково хороша для маленьких и больших таблиц, и не меняется существенно при росте таблицы. |