Решение домашнего задания №5.

advertisement
Вариант решения домашнего задания №5.
Задача 1.
Пусть даны отношения R(x,y) и S(y,z). Главное предположение, которое требуется
учитывать при построении таких алгоритмов следующее:
Предположение. Если V ( R, y)  V (S , y) , то все значения атрибута y,
встречающиеся в отношении S, встречаются в кортежах отношения R, т.е. каждый кортеж
отношения S обязательно соединится хотя бы с одним кортежем отношения R.
а) Оценим количество кортежей, полученных в результате антисоединения
отношений R и S. Рассмотрим два случая.
1. Пусть V ( R, y)  V (S , y) . Количество различных значений атрибута y отношения
R, которые не встречаются в отношении S = V ( R, y)  V (S , y) . Доля этих кортежей в
отношении R при условии равномерного распределения значений атрибута по кортежам =
=
V ( R, y )  V ( S , y )
.
V ( R, y )
Таким образом, количество кортежей в результате = T ( R) *
2. Пусть теперь V ( R, y)  V (S , y) .
атрибута y, встречающиеся в отношении R,
отношения R соединяются с кортежами
кортежей в результате=0.
В общем виде получим:
Количество кортежей, полученных

отношений R и S = max T ( R) *

V ( R, y )  V ( S , y )
.
V ( R, y )
Тогда в силу предположения все значения
встречаются в отношении S, т.е. все кортежи
отношения S. Таким образом, количество
в результате проведения антисоединения
V ( R, y )  V ( S , y ) 
, 0 .
V ( R, y )

б) внешнее соединение отношений R и S.
Результат внешнего соединения отношений состоит из:
 Кортежей, полученных в результате естественного соединения отношений
(количество = a).
 Для каждого кортежа t  R , который не соединяется ни с одним из кортежей
отношения S, формируется кортеж (t , NULL) (количество = b).
 Для каждого кортежа q  S , который не соединяется ни с одним из кортежей
отношения R, формируется кортеж ( NULL, q) (количество = c).
Таким образом, количество кортежей, полученных в результате внешнего
соединения = a+b+c . Следует заметить, что в силу предположения либо b=0 (если
V ( R, y)  V (S , y) ), либо с=0 (если V ( R, y)  V (S , y) ).
Первое слагаемое известно: a 
T ( R)T ( S )
.
max{V ( R, y ),V ( S , y )}
Значение b можно оценить посредством антисоединения отношений R и S.
Действительно, так как формируется по одному кортежу для каждого кортежа t  R ,
который не соединяется ни с одним из кортежей отношения S, получим, что b равно числу
кортежей,
полученных
в
результате
антисоединения
R
и
S,
т.е.

V ( R, y )  V ( S , y ) 
b  max T ( R) *
, 0 (из решения пункта а)).
V ( R, y )


Аналогично, с – число кортежей, полученное в результате антисоединения

отношений S и R, т.е. с  max T ( S ) *

V ( S , y )  V ( R, y ) 
, 0 .
V (S , y)

Таким образом, число кортежей, полученных в результате внешнего соединения =
=


T ( R)T ( S )
V ( R, y)  V ( S , y) 
V ( S , y)  V ( R, y) 
 max T ( R) *
, 0  max T ( S ) *
, 0 .
max{V ( R, y),V (S , y)}
V ( R, y)
V (S , y)




Задача 2.
Очевидно, что при расчетах могут получиться нецелые числа. В этих случаях
принято рассматривать случай, когда получается большее число кортежей, т.е. нецелые
результаты принято округлять в большую сторону.
a) A= W
X
T(A1)=T(W
Y
X) =
Z.
T (W )T ( X )
300 *100

 429 кортежей.
max{V (W , b),V ( X , b)} max{ 70,50}
Так как V(X,c)=20, то так как оценка размера отношения A1 составляет 429 кортежа,
то можно ожидать, что все 20 различных значений атрибута c попадут в отношение A1.
Таким образом, принимается V(A1, c) = 20.
T(A2) =T(A1
Y) =
T ( A1 )T (Y )
429 * 500

 5363 кортежа.
max{V ( A1 , c),V (Y , c)} max{ 20,40}
Так как V(Y,d)=100 и оценка размера отношения A2 составляет 5363 кортежа, то
принимается V(A2, d) = 100.
T(A)=T(A2
Z) =
T ( A2 )T ( Z )
5363*1000

 17877 кортежей.
max{V ( A2 , d ),V ( Z , d )} max{100,300}
e<50 AND d>10 (Z).
б) A=d=30 (Y)
T (Y )
500

 5 кортежей.
V (Y , d ) 100
T ( Z ) 1000

 112 кортежей. (дважды делим на 3,
d>10 (Z)) =
9
9
T(A1)=T(d=30 (Y))=
T(A2)=T(e<50
AND
поскольку оба условия имеют форму неравенства).
Соединение производится по атрибуту d. Очевидно, что V ( A1 , d )  1 . Следует
ожидать также, что так как атрибут d являлся атрибутом выборки при определении A2, то
количество различных значений этого атрибута также сократится в 3 раза, т.е.
V ( A2 , d ) 
V ( Z ) 300

 100 .
3
3
Т(А)=Т(A1
в) A = d=5 OR
e=10
A2) =
T ( A1 )T ( A2 )
5 *112

 6 кортежей.
max{V ( A1 , d ),V ( A2 , d )} max{1,100}
(Z).
T (Z )
1000

 4 кортежа.
V ( Z , d ) 300
T ( Z ) 1000

 10 кортежей.
Количество кортежей отношения Z(e=10)=
V ( Z , e) 100
Количество кортежей отношения Z(d=5) =
Пусть p1 – вероятность того, что первое условие не будет выполнено;
p2 – вероятность того, что второе условие не будет выполнено.
p1= 1 
4
10
 0.996 , p2=1 
 0.99 .
1000
1000
Пусть p – вероятность того, что оба условия не будут выполнены.
p = p1* p2=0.996*0.99=0.98604.
Вероятность того, что выполняется хотя бы одно условие составляет 1- p. Таким
образом, T(A)= T (Z )1  p  1000* (1  0.98604)  14 кортежей.
г) A= b=5 OR d >10 ( X
Y) = b=5 OR d >10 (  X .cY .c ( X  Y ) ).
X.c<Y.c
T(A1)=T( X  Y )= T ( X ) * T (Y )  100 * 500  50 000 кортежей.
T ( A2 )  T ( X .cY .c ( X  Y )) 
T ( A1 ) 50000

 16667 кортежей.
3
3
Очевидно, что в отношении A2 атрибут b в худшем случае принимает столько же
значений, что и в отношении X, т.е. V ( A2 , b)  V ( X , b)  70 .
T ( A2 )
16667

 239 кортежей.
V ( A2 , b)
70
T ( A2 ) 16667

 5556 кортежей.
Количество кортежей отношения A2 (d>10)=
3
3
Количество кортежей отношения A2 (b=5) =
Пусть p1 – вероятность того, что первое условие не будет выполнено;
p2 – вероятность того, что второе условие не будет выполнено.
p1= 1 
239
5556
 0.98566 , p2=1 
 0.6666 .
16667
16667
Пусть p – вероятность того, что оба условия не будут выполнены.
p = p1* p2=0.98566*0.6666=0.65704.
Вероятность того, что выполняется хотя бы одно условие составляет 1- p. Таким
образом, T(A)= T ( A2 )1  p   16667 * (1  0.65704)  5717 кортежей.
Задача 3.
Пусть требуется получить список студентов из двух заданных групп (например, 9001 и
9002) и список несданных ими экзаменов.
Текст запроса может быть следующим:
SELECT Students.Name, Exams.Name FROM Students NATURAL JOIN Stud_Exam
NATURAL JOIN Exams WHERE (Mark=”неудовлетворительно” OR Mark=”не явился”)
AND (Group=”9001” OR Croup=”9002”).
Для оптимизации выполнения
статистические характеристики:
1.
V(Students, Group) = 250.
2.
V(Stud_Exams,
Mark)
=
неудовлетворительно, не явился).
данного
5
запроса
(отлично,
потребуются
хорошо,
следующие
удовлетворительно,
В качестве начальных логических планов запроса согласно различным порядкам
соединения отношений можно принять:
План 1.
Students.Name, Exams.Name
(Mark=”неудовлетворительно” OR Mark=”не явился”) AND (Group=”9001” OR Group=”9002”)
Students
Stud_Exam
Exams
План 2.
Students.Name, Exams.Name
(Mark=”неудовлетворительно” OR Mark=”не явился”) AND (Group=”9001” OR Group=”9002”)
Exams
Stud_Exam
Students
План 3.
Students.Name, Exams.Name
(Mark=”неудовлетворительно” OR Mark=”не явился”) AND (Group=”9001” OR Group=”9002”)
Stud_Exam
Students
Exams
Для улучшения логических планов запроса нужно переместить выборку на более
низкие
уровни
дерева,
разбив
условие
выборки
на
2:
условие
(Mark=”неудовлетворительно” OR Mark=”не явился”) должно переместиться в ветвь,
соответствующую отношению Stud_Exam, условие (Group=”9001” OR Croup=”9002”) – в
ветвь, соответствующую отношению Students.
Таким образом, получим:
План 1.
Students.Name, Exams.Name
(Group=”9001” OR Group=”9002”)
(Mark=”неудовлетворительно” OR Mark=”не явился”)
Students
Stud_Exam
Exams
Заметим, что в результирующем множестве соединения отношений Stud_Exam и
Exams нас интересует только поля StudID, Exams.Name. Следовательно, можно при
формировании результирующих кортежей соединения сразу осуществлять проекцию
(конвейерным способом). Это не потребует никаких дополнительных затрат, а количество
блоков, которое займет спроектированное отношение, будет значительно меньше.
План 2.
Students.Name, Exams.Name
(Mark=”неудовлетворительно” OR Mark=”не явился”) (Group=”9001” OR Group=”9002”)
Exams
Stud_Exam
Students
В этом случае выполнение оператора проекции после соединения отношений
Stud_Exam и Students также возможно, но проектировать нужно будет уже два поля
ExamID и Students.Name.
План 3.
Students.Name, Exams.Name
(Mark=”неудовлетворительно” OR Mark=”не явился”)
(Group=”9001” OR Group=”9002”)
Stud_Exam
Students
Exams
В этом случае после соединения отношений Students и Exams можно конвейерным
способом выполнить проекцию атрибутов StudID, Students.Name, ExamID и Exams.Name.
Заметим также, что в плане 3 соединение отношений Students и Exams фактически
является их декартовым произведением, поскольку общих атрибутов у этих двух
отношений нет.
Оценка размеров промежуточных отношений.
План 1.
Students.Name, Exams.Name
64
64
(Group=”9001” OR Group=”9002”) 40
8000
(Mark=”неудовлетворительно” OR Mark=”не явился”) 8000
Students 5000
Stud_Exam 20000
Exams 500
Размер
 2*
выборки
из
отношения
Students
по
группе
=
T ( Students)
5000
 2*
 40 . Здесь два условия, объединенные логическим
V ( Students, Group)
250
оператором OR, являются взаимоисключающими. Поэтому количество кортежей, которые
удовлетворяет общему условию, выражает как количество студентов одной группы,
умноженное на 2.
Аналогично, размер выборки из отношения Stud_Exams по оценке =
= 2*
T ( Stud _ Exam)
20000
 2*
 8000 .
V ( Stud _ Exam, Mark )
5
Очевидно, что после выборки студентов по заданным группам количество различных
значений атрибута StudID будет 40. После выборки из отношения Stud_Exam по заданным
оценкам количество различных значений атрибута StudID будет 5000, поскольку в
худшем случае возможно возникновение информации о всех 5000 студентах базы в 8000
кортежах выборки из Stud_Exam. В этих же 8000 кортежах может содержаться
информация обо всех 500 экзаменах, которые сдавались студентами. Поэтому количество
различных значений атрибута ExamID после выборки из Stud_Exam будет 500.
Размер соединения Stud_Exam и Exams = 8000*500/max{500,500}=8 000 кортежей.
Так как число различных значений StudID в выборке отношения Stud_Exam было
равно 5 000, учитывая размер соединения отношений Stud_Exam и Exams, можно
ожидать, что количество различных значений атрибута StudID по правой ветке составит
5 000. Тогда размер окончательного соединения = 40*8000/max{40; 5000}=64 кортежа.
Очевидно, проекция имеет тот же размер.
План 2.
Students.Name, Exams.Name 64
64
64
(Mark=”неудовлетворительно” OR Mark=”не явился”) 8000
Exams 500
Stud_Exam 20 000
(Group=”9001” OR Group=”9002”) 40
Students 5 000
Размер соединения отношений Stud_Exam и Students с учетом выборки составляет
8000*40/max{5000,40}=64 кортежа, причем так как V(Stud_Exam, ExamID)=500, то можно
ожидать, что число различных значений атрибута ExamID в результате соединения будет
также равно 64, т.е. в результате соединение отношений Stud_Exam и Students в худшем
случае будет содержаться информация о 64 различных экзаменах.
Поэтому размер окончательного соединения = 500*64/max{500,64}=64 кортежа.
План 3.
Students.Name, Exams.Name 64
64
20 000
(Mark=”неудовлетворительно” OR Mark=”не явился”) 8000
(Group=”9001” OR Group=”9002”) 40
Stud_Exam
20 000
Students 5 000
Exams 500
Поскольку соединение отношений Students и Exams является по своей сути
декартовым произведением, размер отношения = 40*500=20 000 кортежей, причем в нем
количество различных значений атрибута StudID=40, а атрибута ExamID=500.
Соединение с отношением Stud_Exam теперь будет проходить по двум атрибутам
StudID и ExamID. Размер окончательного соединения = 20000*8000/(max{40,
5000}*max{500,500})=64 кортежа.
Сейчас уже очевидно, что план 3 продуцирует наибольшие по размеру
промежуточные отношения и, следовательно, менее удобен для выполнения запроса. Если
сравнивать планы 1 и 2, то предпочтительнее с точки зрения размеров промежуточных
отношений использовать план 2.
Построим физический план запроса для выбранного плана 2. Относительно
использования алгоритмов нужно решить несколько вопросов. Во-первых, требуется
выбрать алгоритм, по которому проводить выборку. Если и существуют индексы по
атрибутам выборок, то эти индексы являются вторичными и, следовательно,
некластеризованными. В этом случае можно ожидать, что при использовании физического
оператора IndexScan потребуется прочитать приблизительно столько же блоков, сколько
кортежей в результате выборки. Судя по размеру отношения Stud_Exam использование
индекса здесь абсолютно неэффективно. Поэтому для чтения и проведения выборки из
отношения Stud_Exam будем использовать цепочку физических операторов
TableScan(Stud_Exam)->Filter(Mark=”неудовлетворительно” OR Mark=”не явился”). В
случае выборки из отношения Students, судя по размерам отношения и результата
выборки, может оказаться, что использование индекса будет более эффективным. Для
этого только требуется, чтобы B(Students)>40, что вполне вероятно. Здесь можно
использовать индекс, т.е. физический оператор IndexScan(Students, Group).
Для выбора алгоритма соединения также можно заметить, что во всех операторах
соединения плана 2 один из операндов имеет малый размер. Можно ожидать, что его
можно поместить в оперативной памяти. Следовательно, можно использовать алгоритм
однопроходного соединения. Причем, поскольку результат промежуточного соединения
невелик, при относительно реальных требованиях на используемую оперативную память
можно обрабатывать результат промежуточного соединения конвейерным способом,
сохраняя его в оперативной памяти и затем подгружая по одному блоку отношение Exams.
Физический план 2.
[Proj(Students.Name, Exams.Name)]
[One-Pass Join]
[One-Pass Join]
[Filter(Mark=”неудовлетворительно”
OR Mark=”не явился”)]
[TableScan(Exams)]
[TableScan(Stud_Exam)]
[IndexScan(Students,Group)]
Download