Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций СБД.doc
Скачиваний:
24
Добавлен:
13.11.2019
Размер:
1.94 Mб
Скачать
      1. Структуры типа б-дерева

Если индексированный файл имеет большой размер, то и его индекс также велик. Поэтому последовательный просмотр даже одного только индекса требует больших затрат времени. Для разрешения такой проблемы можно рассмотреть индексный файл как обычный хранимый файл и создать для него еще один индекс. Эту операцию можно осуществлять повторно нужное количество раз (обычно она применяется трижды). При этом индекс на каждом из уровней будет неплотным по отношению к нижнему индексируемому уровню. Такой подход к организации индексов бинарного типа (или Б-дерева – B-tree) наиболее популярен в реляционных базах данных. Их использование предусмотрено почти во всех СУБД, а некоторые СУБД работают только на основе индекса бинарного типа.

Индексы бинарного типа являются частным случаем древовидного индекса и состоят из двух частей: набора последовательностей и набора индексов.

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

Набор индексов – это неплотный иерархический индекс для последовательного набора.

На рис. 2.2.2 показан пример индекса бинарного типа с глубиной, равной трем. Корневая запись содержит два значения индексируемого атрибута. Следуя левой линии связи, можем обратиться к записям, значения ключей которых меньше или равны 45, следуя средней линии – к записям, значения ключей которых больше 45 и меньше или равны 78, следуя правой линии – к записям, значения ключей которых больше 78. Аналогичные связи создаются на следующем иерархическом уровне.

Рис. 2.2.2. Индекс бинарного типа

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

    1. Хеширование

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

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

  • Для сохранения записи в СУБД сначала вычисляется хеш-адрес новой записи, а затем диспетчер файлов помещает эту запись по вычисленному адресу.

  • Для извлечения нужной записи по заданному значению хеш-поля в СУБД сначала вычисляется хеш-адрес, а затем диспетчеру файлов посылается запрос для извлечения записи по вычисленному адресу.

В качестве иллюстрации предположим, что у нас есть записи с данными о поставщиках с номерами 100, 200, 300, 400 и 500 (вместо П1, П2, ПЗ, П4, П5 в нашем примере), для хранения каждой из них предназначается отдельная страница, а в качестве хеш-функции используется следующая:

хеш-адрес (т.е. номер страницы или RID-указатель) = = остаток от деления на 13 числа, содержащегося в поле П№

Это простейший пример общего класса хеш-функций типа деление/остаток (в качестве делителя следует выбирать простое натуральное число). В этом примере номерами страниц для заданных записей будут 9, 5, 1, 10 и 6 соответственно.

В общем случае, для определения адреса вместо хеш-функции можно было бы использовать непосредственно значение ключевого поля (если это поле имеет числовой тип данных). Однако такой способ нежелателен, поскольку диапазон возможных значений ключевого поля может быть гораздо шире диапазона имеющихся адресов. В нашем примере номера записей с данными о поставщиках находятся в диапазоне 000–500, тогда как в действительности может быть только несколько реальных поставщиков. Таким образом, во избежание неэффективного использования дискового пространства следует найти такую хеш-функцию, чтобы можно было сузить диапазон 000–500, например, до 0–9. Для того чтобы зарезервировать дополнительное пространство (рекомендуется 20% от исходной величины), диапазон 0–9 в нашем примере расширен до 0–12 за счет делителя 13.

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

Еще одним недостатком хеширования является возможность возникновения коллизий, т.е. ситуаций, когда две или более различных записи имеют одинаковые адреса. Допустим, что файл поставщиков из предыдущего примера (с поставщиками 100, 200 и т.д.) содержит также поставщика с номером 1400. При использовании хеш-функции типа "остаток от деления на 13" возникнет коллизия (по адресу 9) с записью 100. Ясно, что такая хеш-функция неадекватна и для устранения коллизий необходимо ее исправить.

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

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