Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информационное обеспечение(лекции)

.pdf
Скачиваний:
77
Добавлен:
27.03.2016
Размер:
2.19 Mб
Скачать

1)определяют направление доступа (можно двигаться только в тех направлениях, которые заданы указателями);

2)соединяют вместе связанные по смыслу данные;

3)отображают ориентированные ребра в древовидных или сетевых структурах;

4)связывают память на дисках и организуют цепочки дисковых страниц и т. п.

Применение многосвязанных списков – это основной механизм, позволяющий разработчикам СУБД реализовывать сложные нелинейные структуры. Однако следует избегать слишком большого количества указателей, поскольку на них тратится память и время на переходы по указателям. Кроме того, при большом количестве указателей основная структура, представляемая в памяти ЭВМ, теряет четкость, и могут возникнуть связи, которые в отображаемой структуре отсутствуют.

3.2 Модель внешней памяти

Данные хранятся во внешней памяти на магнитных дисках, магнитных лентах и т.д., а их обработка выполняется в оперативной памяти ЭВМ. Поэтому при обработке некоторые порции данных пересылаются из внешней памяти в оперативную либо наоборот.

При больших объемах данных в БД может потребоваться несколько томов внешней памяти. Однако обмен между внешней и оперативной памятью выполняется небольшими порциями данных – обычно объемом не более нескольких сотен байт.

С этой целью внешняя память разбивается на части, называемые блоками или страницами. Данные пересылаются блоками. Операции пересылки еще называют обменом данными между внешней и оперативной памятью. Такой обмен называется чтением блока, а в обратном направлении - записью блока.

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

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

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

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

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

111

0, 1, 2, ...,х

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

В качестве адресов записей файла во внешней памяти используют:

машинный адрес, относительный адрес, ключ записи.

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

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

метода поиска записей в файле по значению ключа.

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

Запись обычно состоит из:

1)служебных полей, в которых хранятся указатели, реализующие связи с другими записями, и другая информация, необходимая для организации управления файлом,

2)полей хранимых данных.

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

Если файл базы данных состоит из записей фиксированной длинны, то в одном блоке может разместиться k записей:

V

бл.

 

 

k =

 

 

,

 

 

Vз.

 

где - обозначает целую часть числа; Vбл. и Vз. - соответственно объем

блока и записи в байтах.

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

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

112

Записи, которые должны были размещаться в одном блоке, связываются специальными указателями в одну цепь.

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

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

В этом случае требуемое количество блоков:

K бл.

=

 

 

 

N з.

V

бл.

(1 − r)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Vз.

где r < 1 – незаполненная часть блока; N з. - количество записей в файле. Считается, что все блоки каждого файла пронумерованы: 1, 2, ..., β, ..., N и

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

 

 

 

 

 

 

 

 

 

 

 

 

i

 

 

,

β =

 

 

 

 

 

 

V

бл.

(1 − r)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Vз.

 

Среднее время выполнения операций обмена зависит от типа устройства внешней памяти (от его характеристик) и от размера блока:

t0 = Vбл.t р + tподг. ,

где t0 - среднее время выполнения операции обмена; t р - время

считывания, приведенное к одному байту (т.е. время считывания одного байта); tподг. - время подготовки устройства к выполнению операции обмена.

Время поиска данных в файле:

tп = X 0t0 + X c tc ,

113

где tп - время выполнения операции поиска; tc - среднее время выполнения в процессоре одной операции сравнения; X 0 - количество операций обмена;

X c - количество операций сравнения.

Если tc << t0 , то время поиска в основном определяется временем,

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

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

объем блока;

объем байта;

количество записей в блоке файла nз.бл. ;

количество записей в блоке индекса;

количество блоков в файле данных nбл.ф. ;

доля резервируемой части блока r (при начальной организации данных в файле);

длина поля, отведенного для указателя;

количество записей в файле nз.ф. ;

размер записи Vз. ;

длина ключевого поля записи;

число записей файла, удовлетворяющих условию поиска Q;

среднее число блоков переполнения на один блок файла;

среднее время обмена t0 .

На

рисунке

3.7 изображен файл со следующими характеристиками:

nз.ф. =10;

nз.бл. =4; r

=0,5. Записи файла описываются схемой: F ( A1 , A2 , A3 , A4 ) ,

т.е. nп.з. =4.

 

При начальной загрузке при таких характеристиках для организации файла требуется 5 блоков.

3.3. Методы поиска и индексирования данных

При рассмотрении последующего учебного материала используются модели, приведенные в подразделах 3.1, 3.2.

3.3.1 Последовательный поиск

Последовательный поиск заключается в последовательной проверке всех записей файла на их соответствие условию поиска Q. Записи, значения полей которых удовлетворяют условию Q, выдаются в качестве результата поиска.

114

Рисунок 3.7 - Пример организации файла при начальной загрузке

Поиск по равенству K = a , где K – значение ключевого поля. Алгоритм поиска заключается в последовательном просмотре записей файлы и проверке условия K = a . Если запись найдена, то алгоритм заканчивает свою работу (удачный поиск). В противном случае поиск заканчивается просмотром последней записи файла (неудачный поиск).

Если ключ K с равной вероятностью может принимать любое из заданных значений, то в среднем для выполнения поиска требуется время:

tп t0 nбл.ф. / 2

Поиск по интервалу значений ключа a K b . Алгоритм поиска заключается в последовательном просмотре всех записей файла, так как заранее неизвестно, какие записи удовлетворяют условию Q, а какие не удовлетворяют.

Требуемое время на поиск:

tп t0 nбл.ф.

115

i = 1, 2, ..., n .

Поиск

по множеству значений K = ai

, i = 1, 2, ..., n , где

ai принимает

значения из

множества { a1 , a2 ,..., ai ,..., an }.

Алгоритм поиска

заключается в

последовательном просмотре всех записей файла, причем для каждой записи осуществляется n проверок по равенству K = ai , где

Основным достоинством последовательного поиска данных при последовательной организации файла является простота его реализации.

3.3.2. Бинарный поиск

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

Кзаписи1 £ Кзаписи2

£ ... £ Кзаписиnз. ; Кзаписи1 ³ Кзаписи2 ³ ... ³ Кзаписиnз.

В этом случае можно построить более эффективные алгоритмы поиска,

поскольку после сравнения

значения a (условие поиска Q: K = a ) со

значением ключа i -й записи файла ясно, в какой части файла продолжать поиск.

Методы поиска записей в упорядоченном файле различаются друг от друга стратегией выбора очередной записи из файла для выполнения операции сравнения ключа в соответствии с заданным условием Q. Метод бинарного поиска основан на делении интервала поиска пополам.

Поиск по равенству K = a . Алгоритм поиска заключается в следующем. Файл считают упорядоченным по возрастанию ключа. Сравнивают значения ключа средней записи Ki , где i = nз.ф. / 2 со значением a . Если Ki = a то поиск

удачный и алгоритм заканчивает свою работу. Если Ki < a , то для продолжения поиска выбирается средняя запись правой половины файла: зi ,..., зj ,..., з, где

i = nз.ф. / 2 , j = i + (nз.ф. i) / 2

Если Ki > a , то для продолжения поиска выбирается средняя запись левой половины файла: з1 , з2 ,..., з j ,..., зi , где

i = nз.ф. / 2 , j = (nз.ф. i) / 2

Процесс деления интервала пополам продолжается до тех пор, пока не будет найдена искомая запись ( Ki = a ), либо пока в интервале не останется

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

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

Поиск по интервалу значений a K b . Алгоритм поиска следующий.

Вначале выполняется бинарный поиск записи, значение ключа которой удовлетворяет условию Ki = a , либо, если такой записи нет в файле, то

значение ключа которой является наиболее близким к a по условию a £ Ki .

116

Далее последовательно читаются записи в блоках файла до тех пор, пока не будет нарушено условие: K i b .

3.3.3. Индекс - «бинарное дерево»

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

На рисунке 3.8 представлено бинарное дерево, построенное для файла из 15 записей.

Рисунок 3.8 - Пример бинарного дерева

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

117

Записи бинарного дерева обычно меньше по объему памяти записей основного файла Vз.б.д. < Vз. , так как содержат только одно поле данных (поле

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

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

3.3.4. Неплотный

индекс

Пусть основной

файл F упорядочен по полю ключа K . Построим

дополнительный файл

FD (рисунок 3.9) по правилу:

Рисунок 3.9 - Пример неплотного индекса

1) записи файла FD имеют формат FD(K , P) , где K -поле, принимающее значение ключа первой записи блока основного файла F ; P – указатель на этот блок;

118

2) записи файла FD упорядочены по полю K . Полученный файл FD называется неплотным индексом. Количество записей файла FD равно количеству блоков основного файла F . Для организации файла FD требуется дополнительная внешняя память.

Рисунок 3.10 - Пример структуры типа B-дерево

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

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

Полученная структура называется В-деревом порядка m , где m – количество записей в блоке индекса. Такое дерево должно иметь в каждом узле

119

не менее m / 2 зависимых узлов и все листья должны располагаться на одном уровне.

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

При поиске по интервалу значений a K b вначале выполняется поиск по K = a в В-дереве, а затем – последовательный поиск по условию K b в блоках 1-го уровня В-дерева.

3.3.5. Плотный индекс

Пусть по каким-либо причинам невозможно упорядочить основной файл

Fпо ключу K . Построим дополнительный файл FD по правилу [17]:

1)записи файла FD имеют формат FD(K , P) , где K – поле, принимающее

значение ключа записи основного Файла F ; P – указатель на эту запись;

2) записи файла FD упорядочены по полю K . Полученный файл называется плотным индексом. Он строится почти так же, как и неплотный индекс. Различие заключается в том, что для каждого значения ключа K в файле FD имеется отдельная запись, а в неполном индексе – только для значения ключа пер. вой записи блока. Пример плотного индекса представлен на рисунке 3.11. Над плотным индексом можно также построить В-дерево.

3.3.6. Инвертированный файл

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

правилу:

1)записи файла FDi имеют формат FDi (Ki , P) где Ki - поле, принимающее значение вторичного ключа Ki записи основного файла; P – указатели на записи основного файла F , имеющие данное значение вторичного ключа Ki ,

2)записи файла FDi , упорядочены по полю Ki .

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

120