
Гадасин_Д_В_Методические_указания_по_выполнению_практических_занятия
.pdfоперативную память не загружена и ключ поиска является одновременно первичным ключом записей данных, для каждой из описанных ниже структур следует определить:
1. Общее количество блоков, требуемых для хранения файла с 1 000 000
записей.
2. Число операций, необходимых для извлечения записи, обладающей заданным значением ключа поиска.
Для случаев:
1.Данные размещены в последовательном файле, отсортированном по ключу поиска и каждый блок состоит из A записей. В-древовидный индекс является плотным.
2.То же, что и в п.п. 1, но В-дерево является разреженным.
3.Листья В-дерева содержат не указатели на записи данных, а записи как таковые. Блок способен вместить A записей, но блок-лист заполнен в среднем на С%, (если
A = 10 C = 70, то блок данных хранит 7 записей).
4. Файл данных является последовательным, а В-дерево – разреженным, но каждому основному блоку данных поставлен в соответствие блок переполнения. Каждый основной блок в среднем полон, а область блока переполнения используется на 50%.
Исходные данные для задачи – 25 вариантов
Вариант |
A |
B |
C |
|
|
|
|
0 |
10 |
100 |
70 |
|
|
|
|
1 |
12 |
90 |
90 |
|
|
|
|
2 |
24 |
100 |
80 |
|
|
|
|
3 |
36 |
200 |
90 |
|
|
|
|
4 |
28 |
140 |
70 |
|
|
|
|
5 |
42 |
180 |
80 |
|
|
|
|
6 |
56 |
200 |
80 |
|
|
|
|
7 |
24 |
100 |
70 |
|
|
|
|
8 |
50 |
120 |
80 |
|
|
|
|
9 |
16 |
140 |
90 |
|
|
|
|
10 |
22 |
100 |
60 |
|
|
|
|
11 |
30 |
180 |
90 |
|
|
|
|
12 |
28 |
190 |
70 |
|
|
|
|
13 |
12 |
150 |
80 |
|
|
|
|
14 |
22 |
140 |
70 |
|
|
|
|
15 |
28 |
220 |
90 |
|
|
|
|
16 |
30 |
160 |
80 |
|
|
|
|
17 |
16 |
80 |
90 |
|
|
|
|
18 |
20 |
160 |
80 |
|
|
|
|
19 |
42 |
100 |
90 |
|
|
|
|
21
20 |
30 |
140 |
80 |
|
|
|
|
21 |
26 |
180 |
70 |
|
|
|
|
22 |
18 |
80 |
70 |
|
|
|
|
23 |
56 |
200 |
90 |
|
|
|
|
24 |
42 |
160 |
70 |
|
|
|
|
25 |
30 |
120 |
80 |
|
|
|
|
A – количество записей данных в одном блоке
B – количество указателей в одном индексном блоке
C – процент заполнения блока В-дерева
Разбор 0 варианта
Случай 1
1.Чтобы найти ответ на первый вопрос, необходимо вычислить количество индексных блоков и блоков данных, требуемых для хранения 1 000 000 записей.
2.Так как блок данных состоит из 10 записей, то для хранения 1 000 000
потребуется 100 000 блоков.
3.Чтобы посчитать количество блоков в дереве нужно определить сколько в нем уровней и сколько блоков на каждом из них. Так как блоки с указателями на блоки данных находятся только на последнем уровне, на этом уровне должно хватить места для указателей на 1 000 000 записей.
4.Так как каждый индексный блок содержит 100 указателей, но заполнены из них только 70%, то для адресации можно использовать лишь 70 указателей в каждом блоке.
Поэтому, если в корне находится один блок с 70 указателями (700), то на втором уровне будет 70 блоков (701). И так на каждом нижележащем уровне будет в 70 раз больше блоков,
чем на предыдущем.
5.Зная это, нужно найти 70 ≥ 1 000 000. В данном случае = 4.
6.Таким образом, чтобы расположить 1 000 000 указателей потребуется 704 = 24 010 000 блоков на уровне листьев. А также 700 + 701 + 702 + 703 = 347 971 блоков на остальных уровнях. Всего потребуется 24 357 971 индексных блоков.
7.Так как для хранения данных используется 100 000 блоков, то всего потребуется 24 457 971 блоков.
8.Чтобы найти ответ на второй вопрос, необходимо знать сколько уровней содержит дерево. Ранее было выяснено, что дерево содержит 5 уровней (т.к. начинаются уровни с нулевого). При поиске, чтобы опуститься на уровень ниже, необходимо найти
нужный ключ и указатель на нижний уровень дерева из 70.
22
9. Так как они упорядочены, можно использовать бинарный поиск. Чтобы найти необходимый ключ в одном блоке на одном уровне, необходимо log2 70 ≈ 7 операций.
Учитывая, что уровней 5, необходимо 7 * 5 = 35 операций.
Случай 2
1.Данный случай будет отличаться от первого тем, что из-за неплотного индекса потребуется меньше указателей. Разряженный индекс содержит только по одному указателю на каждый блок данных.
2.В файле данных 1 000 000 записей. Так как один блок содержит 10 записей данных, всего требуется 100 000 блоков и столько же указателей на нижнем уровне,
которые указывают на первые элементы этих блоков.
3.Учитывая то, что используются только 70% дерева, потребуется 70 блоков,
где 70 ≥ 100 000. Посчитав, получаем |
= 3, и 703 = 343 000 блоков на уровне |
«листьев». |
|
4.Всего на всех уровнях находится 700 + 701 + 702 + 703 = 347 971 блоков.
Так как требуется хранить еще 100 000 блоков записей, то всего понадобится 447 971 блок.
5.Чтобы найти ответ на второй вопрос, необходимо знать сколько уровней содержит дерево. Ранее было выяснено, что дерево содержит 4 уровней (т.к. начинаются уровни с нулевого). При поиске, чтобы опуститься на уровень ниже, необходимо найти нужный ключ и указатель на нижний уровень дерева из 70.
6.По аналогии с первым случаем, используя бинарный поиск для нахождения нужного ключа в одном блоке на одном уровне, необходимо log2 70 ≈ 7 операций. Всего 4
уровня, поэтому в индексном файле будет произведено 7 * 4 = 28 операций.
7. Так как индекс разряженный, после нахождения блока данных с нужным ключом, необходимо найти в нем нужную запись. Так как в блоке данных содержится 10
записей, потребуется log2 10 ≈ 4 операции.
8.Таким образом всего для нахождения нужной записи необходимо 28 + 4 = 32
операции.
Случай 3
1. В данном случае на уровне «листьев» находятся сами данные. Так как блок хранит 7 записей, для хранения 1 000 000 записей потребуется 142 858 блоков.
23
2.Чтобы найти общее количество блоков на уровне «листьев», потребуется
70 |
блоков, где 70 ≥ 142 858. |
Посчитав, получаем = 3, и 703 = 343 000 блоков на |
уровне «листьев».
3.Всего потребуется 700 + 701 + 702 + 703 = 347 971 блоков.
4.На первых трех уровнях блоки содержат по 70 записей. Следовательно,
используя бинарный поиск, при поиске будет произведена 3 log2 70 = 21 операция. На последнем уровне блок содержит 7 записей. log2 7 ≈ 3 операции. Таким образом всего потребуется 24 операции.
Случай 4
1. Во втором случае мы уже посчитали, что в случае разряженного индекса на уровне «листьев» находится 703 = 343 000 блоков, а всего на всех уровнях находится
700 + 701 + 702 + 703 = 347 971 блоков.
2.В данном случае, помимо 100 000 основных блоков данных есть еще столько же блоков переполнения. Получается, что всего требуется 547 971 блоков.
3.По аналогии с предыдущими случаями, для поиска по индексному файлу требуется 4 log2 70 = 28 операций.
4.Так как индекс неплотный, после нахождения нужного блока, требуется найти саму запись в блоке. Для просмотра записей в основном блоке данных требуется
log2 10 ≈ 4 операции. Так как у основного блока есть область переполнения в среднем заполненная на 50%, для ее просмотра потребуется еще log2 5 ≈ 3 операции.
5.Таким образом, всего потребуется 28 + 4 + 3 = 35 операций.
Задача 7
Хеш-таблицы
Хеш-таблица, содержащая настолько большое количество записей, что их приходится располагать преимущественно во вторичном хранилище, отличается от варианта хеш-
таблицы, предназначенной для структурирования данных в оперативной памяти, в
следующих аспектах. Прежде всего, массив сегментов должен состоять из блоков, а не отдельных указателей на заголовки связанных списков. Перемешиваемые записи относятся хеш-функцией к определенным сегментам и размещаются в блоках, соответствующих этим сегментам. Если сегмент переполняется, т.е. его блок более не в состоянии содержать все записи, принадлежащие сегменту, одновременно, к основному блоку сегмента присоединяется цепочка блоков переполнения, позволяющих сохранять дополнительные
24

записи. Будем считать, что местоположение основного блока i-го сегмента может быть найдено непосредственно по номеру i. Например, допустимо хранить в оперативной памяти массив указателей на блоки сегментов, индексированный по номерам сегментов.
Альтернативный способ связан с размещением основных блоков всех сегментов в фиксированных последовательных позициях диска.
Полагаем, что каждый блок способен хранить не более двух записей и В=4, т.е. хеш-
функция h возвращает значения в интервале 0-3. Таблица содержит несколько записей с ключами, обозначенными буквами от a до f. Подразумевается, что h(d)=0, h(c)=h(e)=1, h(b)=3, h(a)=h(f)=3. Поэтому шесть записей распределены по блокам именно так, как показано на рисунке. Каждый блок помечен справа дополнительным прямоугольником, «выступом», символически представляющим то место в заголовке блока, где, например,
может быть расположен указатель на соответствующий блок переполнения.
Рис 9. Пример хеш-таблицы.
Задача к решению 7.
Поясните, как повлияют на содержимое сегментов хеш-таблицы, приведенной на рис,
перечисленные ниже операции вставки и замены записей с заданными ключами.
Вставляются записи g-k, а записи a и j удаляются;
При условии, что блок может содержать 3 записи.
В таблице заданы результаты хэш-функций для 26 записей.
Запись |
Результат хэш-функции |
|
|
a |
3 |
|
|
b |
2 |
|
|
c |
1 |
|
|
d |
0 |
|
|
25

e1
f3
g0
h2
i3
j0
k0
l3
m1
n3
o0
p2
q2
r1
s3
t1
u2
v0
w2
x0
y0
z3
Исходные данные для задачи – 25 вариантов
Вариант |
Задание |
|
|
0 |
Вставляются записи g-k, затем записи a и j удаляются. При условии, что блок может содержать 3 записи. |
|
|
1 |
Вставляются записи o-q, затем записи a и p удаляются. При условии, что блок может содержать 2 записи. |
|
|
2 |
Вставляются записи r-t, затем записи a и r удаляются. При условии, что блок может содержать 3 записи. |
|
|
3 |
Вставляются записи w-y, затем записи а и w удаляются. При условии, что блок может содержать 2 записи. |
|
|
4 |
Вставляются записи f-h, затем записи a и c удаляются. При условии, что блок может содержать 2 записи. |
|
|
5 |
Вставляются записи l, n, p, затем записи l и d удаляются. При условии, что блок может содержать 3 записи. |
|
|
6 |
Вставляются записи с, r, t, затем записи a и e удаляются. При условии, что блок может содержать 3 записи. |
|
|
7 |
Вставляются записи p, q, w, затем записи q и e удаляются. При условии, что блок может содержать 3 записи. |
|
|
8 |
Вставляются записи v, x, y, затем записи x и y удаляются. При условии, что блок может содержать 3 записи. |
|
|
9 |
Вставляются записи r, t, u, затем записи r и a удаляются. При условии, что блок может содержать 3 записи. |
|
|
10 |
Вставляются записи r-t, затем записи a и f удаляются. При условии, что блок может содержать 3 записи. |
|
|
11 |
Вставляются записи o-q, затем записи c и f удаляются. При условии, что блок может содержать 2 записи. |
|
|
12 |
Вставляются записи x-z, затем записи z и b удаляются. При условии, что блок может содержать 3 записи. |
|
|
13 |
Вставляются записи g, j, k, затем записи a и j удаляются. При условии, что блок может содержать 2 записи. |
|
|
14 |
Вставляются записи i, r, t, затем записи r и c удаляются. При условии, что блок может содержать 3 записи. |
|
|
15 |
Вставляются записи h, u, w, затем записи c и u удаляются. При условии, что блок может содержать 2 записи. |
|
|
16 |
Вставляются записи s, z, f, затем записи s и c удаляются. При условии, что блок может содержать 2 записи. |
|
|
17 |
Вставляются записи k, o, v, затем записи c и f удаляются. При условии, что блок может содержать 3 записи. |
|
|
18 |
Вставляются записи r, t, e, затем записи c и f удаляются. При условии, что блок может содержать 2 записи. |
|
|
|
26 |
19 |
Вставляются записи w-y, затем записи а и w удаляются. При условии, что блок может содержать 3 записи. |
|
|
20 |
Вставляются записи z, i, a, затем записи a и j удаляются. При условии, что блок может содержать 3 записи. |
|
|
21 |
Вставляются записи v-x, затем записи v и c удаляются. При условии, что блок может содержать 2 записи. |
|
|
22 |
Вставляются записи u-w, затем записи d и f удаляются. При условии, что блок может содержать 3 записи. |
|
|
23 |
Вставляются записи i-k, затем записи c и f удаляются. При условии, что блок может содержать 2 записи. |
|
|
24 |
Вставляются записи r-t, затем записи d и c удаляются. При условии, что блок может содержать 2 записи. |
|
|
25 |
Вставляются записи g, j, k, затем записи j и c удаляются. При условии, что блок может содержать 2 записи. |
|
|
Разбор 0 варианта
1.При вставке записи g хэш-функция вернет 0. Это значит, что запись определяется в блок с индексом 0, и так как там есть свободное место, запись помещается
внего.
2.При вставке записи h хэш-функция вернет 2. В блоке с индексом 2 есть свободное место, поэтому запись помещается в него.
3.При вставке записи i хэш-функция вернет 3. В третьем индексном блоке есть место, поэтому запись помещается в него.
4.При вставке записи j хэш-функция вернет 0. В 0 индексном блоке есть место,
изапись попадает в него.
5.При вставке записи k хэш-функция вернет 0. В 0 индексном блоке уже нет места. Создается блок переполнения, указатель на который помещается в 0 индексный блок.
Сама запись помещается в созданный блок переполнения.
6. При удалении записи a хэш-функция возвращает 3. Запись a удаляется из 3его блока. При удалении записи j хэш-функция возвращает 0. Так как ранее эта запись была вставлена на третье место в 0 блоке, на это место попадает запись k из блока переполнения.
Задача 8
Анализ стоимости операций.
Оценка размера результат операции проекции
Пусть в БД составлен запрос, после его составления он подвергается синтаксическому анализу и преобразуется в логический план. После чего, с помощью определенных алгебраических правил план трансформируется в «предпочтительный» логический план.
На финальной стадии «предпочтительный» план преобразуется в физический. Обычно существует множество различных физических планов для того, чтобы из этого множества сформировать один, каждый оценивается на эффективность (стоимость). По завершении подобного процесса, часто называемого подсчетом стоимости, выбирается физический план, обладающий низшей оценкой стоимости; именно этот план передается исполняющей
27
машине – компоненту процессора запросов, ответственному за практическое осуществление каждой из операций, предусмотренных выбранным физическим планом запроса. При подсчете стоимости всех возможных физических планов, которые удается сконструировать на основе заданного логического плана, для каждого физического плана выбираются:
1.Порядок следования и способ группирования одноименных ассоциативно-
коммутативных операторов, таких как соединение, объединение и пересечение.
2.Алгоритмы реализации каждого оператора логического плана – метод соединения посредством вложенных циклов против алгоритма соединения на основе хеширования.
3.Дополнительные операторы – сканирования, сортировки – необходимые для реализации физического плана, но отсутствующие в явном виде в логическом плане.
4.Способ передачи значений и аргументов от одного оператора к другому-
например, посредством сохранения промежуточных результатов на диске либо с помощью итераторов, позволяющих пересылать данные по одному кортежу или одному буферу оперативной памяти в каждый момент времени.
Для представления размеров отношений, служащих аргументами операций приняты следующие обозначения:
-B(R) – количество блоков, требуемых для хранения всех кортежей отношения R;
-T(R) – количество кортежей отношения R;
-V(R,a) – счетчик значений атрибута а отношения R, т.е. количество различных значений в пределах определенного столбца-атрибута a отношения R. В более общем случае, если (a1, a2, … an) – некоторый список атрибутов отношения R, тогда V(R, (a1, a2, …
an)) – количество различных наборов значений атрибутов a1, a2, … an, или число кортежей в
( |
, |
,... |
|
|
n |
||
1 |
2 |
|
(R))
Оператор проекции π отличается от других операторов тем, что объем результата его выполнения может быть вычислен точно. Поскольку в итоговое отношение проекции включается каждый кортеж отношения-аргумента, изменение объема данных обусловлено только трансформацией структуры кортежа. Оператор проекции относится к категории
«мультимножестввенных операторов и сам по себе не обеспечивает удаление повторяющихся кортежей; если после проецирования прибегнуть к услугам оператора δ,
предназначенный именно для такой цели.
Задача к решению 8.
28
Для отношения R(a,b,c) атрибуты a и b которого относятся к целочисленному четырех-байтовому типу, а компоненты атрибута c являются строками длиной в 100 байт,
под заголовок кортежа R отводится А байт. Пусть объем блока составляет 1024 байт, причем длина заголовка блока равна 24 байт.
1.Найти B(R), если T(R) = B.
Оператор S=πa+b,c(R) предусматривает замену компонентов а и b каждого кортежа R
их суммой.
2.Найти B(S), если T(S) = C.
Оператор U= πa,b(R) предполагает изъятие строкового компонента c.
3.Найти B(U), если T(U) = D.
Исходные данные для задачи – 25 вариантов
Вариант |
A |
B |
C |
D |
|
|
|
|
|
0 |
12 |
10000 |
10000 |
10000 |
|
|
|
|
|
1 |
8 |
20000 |
30000 |
16000 |
|
|
|
|
|
2 |
14 |
23000 |
28000 |
14000 |
|
|
|
|
|
3 |
16 |
16000 |
18000 |
16000 |
|
|
|
|
|
4 |
6 |
26000 |
14000 |
12000 |
|
|
|
|
|
5 |
18 |
23000 |
25000 |
19000 |
|
|
|
|
|
6 |
8 |
15000 |
21000 |
14000 |
|
|
|
|
|
7 |
4 |
17000 |
13000 |
24000 |
|
|
|
|
|
8 |
16 |
25000 |
32000 |
30000 |
|
|
|
|
|
9 |
22 |
11000 |
25000 |
17000 |
|
|
|
|
|
10 |
14 |
14000 |
12000 |
20000 |
|
|
|
|
|
11 |
26 |
30000 |
25000 |
27000 |
|
|
|
|
|
12 |
20 |
24000 |
20000 |
21000 |
|
|
|
|
|
13 |
8 |
30000 |
28000 |
25000 |
|
|
|
|
|
14 |
12 |
28000 |
29000 |
24000 |
|
|
|
|
|
15 |
16 |
30000 |
24000 |
27000 |
|
|
|
|
|
16 |
20 |
11000 |
14000 |
13000 |
|
|
|
|
|
17 |
22 |
17000 |
15000 |
16000 |
|
|
|
|
|
18 |
6 |
13000 |
16000 |
18000 |
|
|
|
|
|
19 |
4 |
12000 |
10000 |
11000 |
|
|
|
|
|
20 |
14 |
15000 |
16000 |
18000 |
|
|
|
|
|
21 |
18 |
21000 |
17000 |
24000 |
|
|
|
|
|
22 |
16 |
15000 |
18000 |
14000 |
|
|
|
|
|
23 |
26 |
34000 |
28000 |
31000 |
|
|
|
|
|
24 |
24 |
15000 |
18000 |
19000 |
|
|
|
|
|
25 |
18 |
14000 |
11000 |
13000 |
|
|
|
|
|
29
Разбор 0 варианта
1. Длина кортежа составляет 120 байт: 12 для заголовка кортежа, 8 для хранения целочисленных атрибутов а и b и 100 для хранения строки. Так как объем блока составляет
1024 байта, 24 байта из которых являются заголовком, в один блок можно уместить
(1 024 − 24) / 120 = 8 кортежей. Учитывая то, что T(R) = 10 000, т.е. R содержит 10 000
кортежей, B(R) = 10 000 / 8 = 1250 блоков.
2.Длина кортежа S составляет 116 байт: 12 для заголовка кортежа, 4 для суммы
и100 для строки. Так как объем блока составляет 1024 байта, 24 байта из которых являются заголовком, в один блок можно уместить (1 024 − 24) / 116 = 8 кортежей. Так как общее количество кортежей по условию 10 000, B(S) = 10 000 / 8 = 1250 блоков.
3.Длина кортежа U равна всего 20 байт: 12 для заголовка кортежа, 8 для целочисленных атрибутов а и b. Так как объем блока составляет 1024 байта, 24 байта из которых являются заголовком, в один блок можно уместить (1 024 − 24) / 20 = 50
кортежей. Так как общее количество кортежей по условию 10 000, B(U) = 10 000 / 50 = 200.
Задача 9
Анализ стоимости операций.
Оценка размера результата оператора выбора (конъюнкция)
При выполнении оператора выбора σ количество кортежей, как правило,
уменьшается, но размер отдельного кортежа сохраняется. В простейшем варианте выбора,
когда атрибут сравнивается с константой, оценить размер итогового отношения несложно,
если имеется возможность выяснить или приближенно оценить количество различных значений сопоставляемого атрибута. Пусть S=σa=c(R), где а – атрибут отношения R, а с – некоторая константа. В качестве оценки рекомендуется использовать следующее соотношение:
Т(S)=T(R)/V(R,a)
Оценка становится точной, если все значения атрибута а распределены с равной вероятностью, данная формула так же позволяет оценить с лучшей точностью если распределение значений а не является однородным, но все значения а одинаково часто упоминаются в запросах, в которых адресуется атрибут а. Еще более близкие к точным оценки удается получить, е если СУБД поддерживает усовершенствованные функции сбора статистических характеристик и ведения гистограмм данных.
Получение оценок размеров итоговых отношений более сложно, если критерий выбора основан на неравенстве S=σa<c(R), или любом другом. В данном случае необходимо
30