Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы и банки данных / Базы и банки данных (5 сем).doc
Скачиваний:
76
Добавлен:
01.05.2014
Размер:
705.54 Кб
Скачать

Плотное и неплотное индексирование

До сих пор предполагалось, что в индексе используются RIDуказатели. Хотя для этого достаточно было бы указателей страниц (т.е. номеров страниц). Конечно, для последующего поиска записи внутри данной страницы придется осуществить еще одну операцию извлечения записи. Однако теперь она будет выполняться воперативной памяти и для этого не придется увеличивать число дисковых операций вводавывода. Эту идею можно развить дальше, если воспользоваться предположением о том, что физическая последовательность файла поставщиков соответствует логической последовательности, заданной, например, на основе номера поставщика. Иначе говоря, предполагается, что в этом файле выполнена кластеризация по данному полю. Допустим, что по этому же полю осуществляется индексирование; тогда нет необходимости в данном индексе хранить указатели для каждой записи индексируемого файла. Все, что требуется,это указатель для каждой страницы, состоящий из максимального номера поставщика для каждой страницы и соответствующего номера страницы. Схематично такая структура показана на рис.4, где для простоты предполагается, что на каждой странице может размещаться максимум две записи. Индекс такой структуры называетсянеплотным(илиразряженным), поскольку в нем содержатся указатели не на все записи индексированного файла. Все описанные выше индексы, напротив, называютсяплотными. Преимущество использования неплотных индексов очевидно: их малый размер позволяет просматривать содержимое базы данных с большей скоростью. Однако с помощью одного только неплотного индекса нельзя выполнить проверку наличия некоторого значения.

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

Индекс S# Файл с данными о поставщиках

Номер

Фамилия

Скидка

Город

S1

Иванов

20

Ростов

S2

Петров

10

Таганрог

S3

Сидоров

30

Таганрог

S4

Федоров

20

Ростов

S5

Аверьянов

30

Азов

Рис.4. Пример использования неплотного индекса

Структура типа б-дерева

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

Перед описанием Б-деревьев введем несколько определений, относящихся к деревьям любого типа.

N1

N2

N3

N4

N5

N6

N7

N8

N9

N10

N11

N12

N13

а)

б)

Рис.4.1. Примеры сбалансированного и несбалансированного деревьев

На рис.4.1а показано дерево. Оно состоит из двух множеств: множество вершин и множества ориентированных дуг. Вершинам соответствуют прямоугольники, а дугам стрелки. Корневой называется вершина, не имеющая входящих в нее дуг. Дерево всегда имеет только один корень. N1 – корневая вершина. Листом называется вершина, которая не имеет выходящих дуг. Т.е.N5,N6,…,N13 – листья. Рассмотрим произвольную вершину. Вершины, в которые входят дуги, начинающиеся в этой первой вершине, называются дочерними, а сама первая вершина – родительской. Например,N8,N9 иN10 –дочерние по отношению кN13 вершины. У листьев нет дочерних вершин. Важным отличительным свойством дерева является то, что каждая вершины кроме корня имеет только одну родительскую вершину.

Предположим, что для двух вершин NJиNKсправедливо следующее:NKявляется дочерней по отношению к вершине, которая в свою очередь, является дочерней по отношению к вершине , которая и т.д. является дочерней по отношению кNJ. В этом случаеNJ– предокNK, аNK– потомокNJ. Например,N6 является потомкомN1, аN1 является предкомN8.N3 также является предкомN8, так как отношение родительский-дочерний является частным случаем отношения предок-потомок.

Дерево называют сбалансированнымтогда и только тогда, когда каждый его лист имеет одинаковое число предков. На рис.4.1а изображено сбалансированное дерево, а не рис.4.1б –несбалансированное.

Хотя не существует структуры хранения, оптимальной для любых приложений, для использования в простых системах следует выбирать структуру сбалансированного дерева ( В balanced). Б-деревоэто обобщение сбалансированного бинарного дерева поиска. Однако каждый узел бинарного дерева имеет не более двух потомков, в узлы Б-дерева имеют множество потомков. Поскольку обычно Б-дерево появляется на диске, а не в основной памяти, оно проектируется так, чтобы каждый его блок полностью занимал блок (страницу) диска. Поэтому в одном блоке Б-дерева могут быть сотни указателей на потомков. Поиск в Б-дереве, при котором обычно проверяется только три дисковых блока, намного эффективнее поиска в бинарном дереве, когда обычно просматривается множество различных дисковых блоков. Различие способов поиска в Б-дереве и бинарном дереве является одним из многочисленных примеров того, чем наиболее удобные структуры данных, хранящихся на диске, отличаются от структур данных, используемых алгоритмами основной памяти.

Со структурой типа Б-дерева, связаны такие основные понятия, как многоуровневый илидревовидныйиндекс.

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

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

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

Набор индексовобеспечивает быстрый непосредственный доступ к набору последовательностей (а, следовательно, и к данным). По сути, набор индексов является индексным файлом со структурой Б-дерева. Комбинация набора индексов и набора последовательностей называется структурой типа Б-плюс-дерева.

50

82

12

32

58

70

89

94

6

8

12

15

18

32

35

40

50

51

52

58

60

62

70

71

78

82

83

85

89

Рис.5. Пример структуры типа Б-дерева

На рис.5 показан простой пример такой структуры. Числа 6, 8, 12, …, 89 являются значениями индексированного поля С. Корневой элемент содержит два значения поля С (50 и 82) и три указателя (номера страниц). Данные со значением поля С, равным или меньшим 50, могут быть найдены с помощью левого указателя; данные со значениями поля С, большим 50 или равным 82, с помощью среднего указателя; наконец, данные со значениями поля С, большим 82,с помощью правого указателя. Другие элементы набора индексов следует интерпретировать подобным образом. Обратим внимание, что благодаря переходу на второй уровень по левому указателю в дальнейшем поиск по правому указателю будет осуществляться ко всем записям со значением поля С, большим 32 и равным или меньшим 50.

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

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

Однако замечательным преимуществом структуры типа Б-дерева является возможность сбалансированной вставки или удаления значений. В качестве примера приведем алгоритм вставки нового значения Vв структуру типа Б-дерева порядкаn. Алгоритм, рассчитанный на вставку значения только в набор индексов, может быть обобщен и на вставку записи в набор последовательностей.

  1. На самом низком уровне набора индексов следует найти элемент (пусть это будет элемент N, содержащий 2nиндексных записей), с которым логически связано вставляемое значениеV. Если элементNсодержит свободное пространство, то значение вставляется в него, и на этом процесс завершается.

  2. В противном случае (если свободного пространства нет, т.е. приходится создавать еще один уровень) разделим элемент Nна два элементаN1 иN2. Обозначим символомSмножество 2n+1 значений, в котором 2nисходных значений и одно новоеV. Тогдаnпервых значений этой логической (уже упорядоченной) последовательности и среднее между ними значениеWнеобходимо поместить в элементN1,nпоследнихв элементN2, а среднее между ними значениеWв родительский элемент Р на более высоком структурном уровне. Впоследствии, при осуществлении поиска некоторого значенияUи достижения элемента Р, поиск будет перенаправлен в сторону элементаN1, еслиUW, либо в сторону элементаN2, еслиU>W.

  3. Далее этот процесс следует повторить для вставки среднего значения Wв родительский элемент Р на более высоком структурном уровне.

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

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

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

На практике каждый узел в дереве является страницей, а потому в нем может храниться более трех указателей и двух ключевых значений. Если страница имеет размер 4096 байт, каждый указатель – длину 4 байта, размер индексируемого поля также равен 4 байтам и каждая страница содержит 4-байтовый указатель на следующий узел того же уровня, в таком случае в одной странице можно сохранить (4096-4)/(4+4) = 511 индексных записей. Таким образом, порядок данного Б+-дерева равен 512. Корень дерева может содержать до 511 записей и иметь до 512 дочерних узлов. Каждый дочерний узел также может содержать до 511 записей, что в целом дает структуру из 261632 записей. В свою очередь, каждый дочерний узел также может иметь до 512 дочерних узлов, что в сумме дает 262144 дочерних узла на уровне 2 этого дерева. Каждый из этих узлов также может содержать до 511 записей, что дает двухуровневую структуру из 133 955 584 записей. Теоретический максимум для количества индексных записей в двухуровневом дереве определяется следующим образом.

Корень 511

Уровень1 261 632

Уровень 2 133 955 584

Всего 133 217 727

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