Logical plan selection
Commutative and associative laws
•
조인, Union, Intersect에 대해서 모두 통한다.
•
set, bag semantics에 대해서도 통한다.
•
theta join은 communtative하지만 associative하지는 않을 수 있다.
Laws for selection
→ or에 대해서는 Set Semantic만 가능하다.
•
binary operator에 대해서는?
◦
C에 대해서 relation을 가지고 있는 친구들에게만 push down할 수 있다. 위 예시에선 R만 C 조건에 대해서 맞는 애들을 가지고 있다고 가정
◦
만약 둘다 C조건을 만족할 수 있다면 natural join인 경우에만 가능하다. 그냥 join이나 theta-join인 경우에는 적용이 안 되는데, 그건 shared attribute가 없기 때문. 반면에 Intersect는 또 되는데 그건 같은 scheme을 가지고 있기 때문.
Laws for projection
Laws about join and products
Laws for duplicate elimination
Laws for grouping and aggregation
Which transformation is good
•
일찍 뽑는게 기본적으로 좋다
•
projection and duplicate elimination은 조심히 다뤄야한다.
Physical plan selection
Estimate size of result
•
Size Parameter
•
Estimating projection
•
Estimating selection
•
Estimating join
•
Estimating Union, Intersect, difference, duplicate elimination, grouping
•
Obtaining estimate for size parameter
Estimate number of disk I/O
•
scanning tables
◦
sort-scan
▪
구현하는 방법은 여러개가 있다. R이 충분히 작다면 메인 메모리 알고리즘, 너무 크다면 multiway merge-sort 같은 걸 해야함.
◦
결과를 계산하기 위한 과정
▪
operator의 arguments들은 디스크에 있지만, 그 결과는 메인 메모리에 남는다고 생각.
•
Parameters for Measuring costs
◦
M: number of main memory buffers
◦
B: number of blocks, B(R)
◦
T: number of tuples, T(R)
◦
V: number of distinct values.
•
I/O cost for scan operators
◦
relation이 clustered 되있다면 disk I/O는 B이다.
◦
relation이 clustered 안 되어있다면, 훨씬 클 것이다. T이다.
◦
index-scan
•
One-pass algorithm
◦
메인 메모리에 arguments 들 중 하나가 들어가야한다.
◦
Tuple at a time, unary operations
▪
selection & projection
▪
relation이 메모리에 맞냐 안 맞냐와 상과없다.
▪
M ≥ 1
▪
cost: table-scan or index-scan of R
▪
clustered 되어있으면 B, 아니라면 T
◦
Full-relation, unary operations
▪
전체 relation에 대해서 적용해야하는 unary operation: 중복제거나 grouping
▪
중복 제거
•
처음 본 튜플이면 output에 복사를 해야함
•
전에 봤던 tuple이면 output으로 안 넣어도 됨.
•
B(중복제거(r)) ≤ M 이다.
▪
grouping
•
마지막 튜플을 보기 전까지 output을 생성할 수 없다.
•
disk I/O는 B이다.
•
M은 B랑 쉽게 관계가 찾아지진 않겠지만, 어쨌든 B보단 작을거야.
◦
Full-relation, binary operations
▪
Bag이냐 Set이냐로 나눌 거다.
▪
Bag union은 매우 간단한 one-pass algorithm으로 계산될 수 있다.
•
number of disk I/O : B(R)+B(S)
▪
다른 binary operation들은 one pass로 동작하려면 min(B(R), B(S)) ≤ M이다.
▪
정확하게 얘기하면 버퍼 한 개는 큰 relation의 block을 읽는데 사용되고, M buffer는 전체 크기가 작은 친구들을 읽는데 사용됨.
▪
Set Union
•
S를 M-1 buffer에 담은 다음, 모든 tuple이 search key가 되도록 search structure를 짠다. 그 다음 R의 각 block을 불러들여서, 모든 t에 대해서 S에 있는지 확인한다.
▪
Set Intersection
•
S를 M-1 buffer에 담은 다음, 모든 tuple이 search key가 되도록 structure를 짠다. R의 각 block을 읽어서 있으면 output, 없으면 무시한다.
▪
Set Difference
•
commutative 하지 않기 때문에 R-S랑 S-R을 구분해야한다.
•
R-S는 each R을 불러들여서 S에 있는지 확인하고 있으면 무시, 없으면 output
•
S-R은 each R을 불러들여서 S에 있으면 S에서 삭제 없으면 아무것도 아낳ㅁ.
▪
Bag Intersection
•
같은게 있다면 둘 중에 minimum만 뽑아야하기 때문에, count라는 값이 있어야한다.
•
이것 때문에 메모리가 살짝 더 필요할 순 있는데, approximation으로 B(s) ≤ M이면 충분
•
일단 S를 M-1에 불러놓고, count를 만든다.
•
R을 하나씩 불러들여서 있으면 count에서 하나를 까고 output, 아니면 아무것도 안 함
▪
Bag Difference
•
뭔지 잘 모르겠지만 어쨌든 불러들여서 비교하는 거임
▪
Product
•
S를 M-1에 불러놓고 R의 값을 하나씩 읽어서 붙이면 된다.
▪
Natural Join
•
R(X,Y)랑 S(Y,Z)랑 한다고 해보자.
•
S를 메인 메모리에 다 담고 Y에 대해서 search key를 설정하자. M-1 만큼 메모리로 사용
•
R의 각 블럭을 읽어들여서 매칭되는게 있으면 output으로 뽑음
▪
disk I/O : B(R) + B(S)이다.
•
Nested Loop Joins
◦
1과 1/2 pass이다.
◦
어떤 사이즈에도 적용이 되고, main 메모리에 맞을 필요가 없다.
◦
Tuple Based Nested Loop Join
▪
T(R) T(S)
◦
Block Based Nested Loop Join
▪
M만큼은 더 적은 Relation을 읽어들이는데 쓰고, 1만큼은 더 큰 relation을 읽어들이는데 씀
▪
B(S)/(M-1)(M-1 + B(R))
•
Two-pass algorithm
◦
일단 읽어서 뭔가 처리를 해서 disk에 쓰고, 이걸 읽어들여서 operation을 마치는 방식
•
ㄷTwo pass algorithm Based on Sorting
◦
Two-phase, Multiway Merge Sort
▪
M buffer로 R을 읽어들여서 정렬한다.
▪
sublist가 M-1개여야한다.
▪
B/M ≤ M-1이어야한다.
▪
전체 I/O는 3B
•
Duplicate Elimniation using sorting
◦
2PMMS처럼 main memory에 각 sublist마다 1block씩 하고 output block을 하나 해놓는다.
◦
하나를 뽑은 다음, sorted sublist에서 나타나는 block을 모두 제거하는 식
◦
따라서 disk I/O는 마찬가지로 3B(R)임
•
Grouping and Aggregation using sorting
◦
마찬가지로 정렬해서 하나씩 잡은 다음에 걔네들 중에 가장 작은 값이 그 다음 grouping value가 되는 식으로 처리
◦
3B(R), B(R) ≤ M^2
•
Sort based Union Algorithm
◦
bag-union의 경우에는 메모리 사이즈에 상관없이 동작하므로, one-pass algorithm을 쓰면 되는데, set-union의 경우에는 하나의 relation이 메인 메모리보다 작아야하므로 two-pass algorithm을 고려해야한다.
◦
disk I/O → 3(B(R) + B(S))
◦
B(R) + B(S) ≤ M^2
•
Sort based Difference Algorithm
◦
마찬가지이다.
•
Sort-Based Join
◦
5(B(R) + B(S))
◦
B(R) ≤ M^2 and B(S) ≤ M^2
◦
Improved sort-merge join
▪
정렬한거를 디스크에 다시 안 쓰고 안 읽으면 두 번씩 아낄 수 있다
▪
3(B(R) + B(S))
▪
B(R) + B(S) ≤ M^2
•
Two-Pass Algorithms Based on Hashing
◦
기본적으로 M-1과 1로 나눈다.
◦
M-1에는 R을 M-1개의 bucket으로 나눈 것들의 block을 하나씩 담고, 나머지 하나에는 R에 대한 블럭 하나를 담는다.
•
Hash Based Algorithm for Duplicated Elimination
◦
이 방법은 Ri가 메모리에 들어갈 정도로 충분히 작을 때 가능하다. 각 Ri bucket은 B(R)/M-1 블럭 사이즈여야한다.
◦
그래야 B(R) ≤ M(M-1) 이 된다.
◦
전체 disk I/O 는 3B(R)임.
•
Hash Based Grouping and Aggregation
◦
비슷하게 M-1 bucket으로 전부다 hashing
◦
B(R) ≤ M^2
◦
3B(R)
•
Hash Based Union, Intersection, Difference
◦
각각 M-1 bucke으로 만들어야한다.
◦
B(R)/M-1과 B(R)/M-1)이 M보다 작아야하므로 min(B(R),B(S)) ≤ M^2이다.
◦
disk I/O : 3(B(R) + B(S))
•
Hash-Join Algorithm
◦
disk I/O : 3(B(R) + B(S))
◦
memory: min (B(R),B(S)) ≤ M^2
•
Hybrid Hash join
◦
S에 대해서 k개로 hashing하기.
◦
k개 중에 m개를 골라서 메모리에 완전히 올리기, 다만 나머지 k-m개에 대해서는 1block씩 남겨놓은 상태로
◦
m B(S)/k + k-m ≤ M
◦
만약 R을 읽었는데, m개 중에 하나로 hashing이 된다면, 그냥 바로 조인하면 된다.
◦
한 번 성공할 때마다 2번 I/O를 아끼는거니까 2(m/k)(B(R) + B(S))만큼 아껴진다.
◦
결론이 뭐냐 m=1이고 k를 낮출 수 있는 만큼 낮춰라.
◦
k = B(S) / M이다. 대입하면 2M(B(R) + B(S))/B(S)
◦
따라서 total cost는 (3-2M/B(S))(B(R) + B(S))이다.
•
Index Based Algorithm
◦
S had an index on join attribute Y
◦
클러스터링은 같은 Y값에 대해 뭉쳐있으면 클러스터링됬다고 한다.
◦
클러스터링된걸 찾을 때는 B(S) / V(S,Y)이고 클러스터링 안 될걸 찾을 때는 T(S)/V(S,Y)이다.
◦
join cost는 clustering 안 되면 B(R) + T(R)T(S)/V(S,Y), clustered 되면 B(R) + T(R)(max(1,B(S)/V(S,Y))
•
Zig-zag join using ordered indexes
◦
B-tree indexes에 있으면 그냥 tree의 leaf를 scan하면 된다.