Esim yhteinen attribuutti C Liitosesimerkki T() = 10,000 riviä T() = 5,000 riviä S() = S() = 1/10 lohkoa Puskuritilaa = 101 lohkoa 1 2 Vaihtoehdot Sisäkkäiset silmukat Liitosjärjestys:, Liitosalgoritmit: Sisäkkäiset silmukat Sort-merge liitos Hakemistoliitos Hajautusliitos for each r do for each s do if r.c = s.c then output {r,s} pair 3 4 1
Sort-merge liitos (1) Jos tai ei ole lajiteltu, lajittele se (2) i 1; j 1; While (i T()) (j T()) do if { i }.C = { j }.C then outputtuples else if { i }.C > { j }.C then j j+1 else if { i }.C < { j }.C then i i+1 Procedure Output-Tuples While ({ i }.C = { j }.C) (i T()) do [jj j; while ({ i }.C = { jj }.C) (jj T()) do [output pair { i }, { jj }; i i+1 ] jj jj+1 ] 5 6 Esimerkki i {i}.c {j}.c j 1 10 5 1 2 20 20 2 3 20 20 3 4 30 30 4 5 40 30 5 50 6 52 7 Hakemistoliitos For each r do [ X index (, C, r.c) for each s X do output {r,s} pair] Huom: X index(rel, attr, value) thenx = set of rel tuples with attr = value Oletus.C hakemistossa 7 8 2
Hajautusliitos Hajautusfunktio h, arvoalue 0 k Solut : G0, G1, Gk Solut : H0, H1, Hk Algoritmi (1) Hajauta tietueet soluihin G (2) Hajauta tietueet soluihin H (3) For i = 0 to k do vertaa tietueita soluissa Gi, Hi Esimerkkihajautus Solut 2 5 Parilliset 4 4 3 12 Parittomat 5 3 8 13 9 8 11 14 2 4 8 4 12 8 14 3 5 9 5 3 13 11 9 10 Esim 1(a): sisäkkäiset silmukat Relaatiot eivät ole peräkkäisiä T() = 10,000 T() = 5,000 S() = S() =1/10 lohkoa Muistia=101 lohkoa Voidaanko tehdä paremmin? Käytetään muistia (1) Luetaan 100 lohkoa R:tä (2) Luetaan kokonaan (1 lohko) + liitos (3) Toistetaan kunnes valmista Kustannus: jokaiselle :n tietueelle [lue tietue + lue ] Yhteensä =10,000 [1+5000]=50,010,000 I/O:ta 11 12 3
Kustannus: jokaiselle lohkolle Lue lohkot: 1000 IOs Lue : 5000 IOs 6000 Voidaanko parantaa? Vaihdetaan järjestys: Yht = 5000 x (1000 + 10,000) = 1000 Yht = 10,000 x 6000 = 60,000 IOs 1,000 5 x 11,000 = 55,000 IOs 13 14 Esim 1(b): sisäkkäiset silmukat Relaatiot peräkkäisiä Kustannus jokaiselle palalle: Lue lohkot: 100 IOs Lue : 1000 IOs 1,100 Yhteensä= 5 palaa x 1,100 = 5,500 IOs Esim 1(c): Lomitusliitos (Merge Join) Molemmat, järjestetty C:n mukaan ; relaatiot peräkkäisiä Muisti.... Kustannus: Lue + Lue = 1000 + 500 = 1,500 IOs 15 16 4
Esim 1(d): Sort-Merge liitos, eivät järjestettyjä, mutta peräkkäisiä --> Lajitellaan, ensin. Kuinka? Merge Sort (i) Jokaiselle 100 lohkon palalle R:ää - Lue lohkot - Lajittelele muistissa - Kirjoita levylle Muisti lajitellut palat 17 18 (ii) Lue kaikki palat + liitä + kirjoita Lajiteltu Muisti Lajiteltu pala Kustannus: Lajittelu Jokainen tietue luetaan, kirjoitetaan, luetaan, kirjoitetaan siis lajittelukustannus: 4 x 1,000 = 4,000 lajittelukustannus: 4 x 500 = 2,000 19 20 5
Esim 1(d): Sort-Merge liitos jatkoa Oletetaan = 10,000 lohkoa peräkkäin = 5,000 lohkoa, ei järjestetty Kokonaiskustannus = järjestys + liitos = 6,000 + 1,500 = 7,500 IOs Silmukat: 5000 x (100+10,000) = 50 x 10,100 100 = 505,000 IOs Sort-Merge: 5(10,000+5,000) = 75,000 IOs Mutta: sisäkkäiset silmukat = 5,500 ei kannata siis! Sort-Merge parempi! 21 22 Esim 1(e): Hakemistoliitos Oletetaan.C hakemisto; 2 tasoa Oletetaan peräkkäin, järjestämätön Oletetaan.C hakemisto mahtuu muistiin Kustannus: Lukeminen: 500 IOs jokaiselle tietueelle: - läpikäy hakemisto - ilmaista - jos löytyy, lue tietue: 1 IO 23 24 6
Kuinka monta yhteistä tietuetta? Kuinka monta yhteistä arvoa? (a) Olkoon.C avain ja.c viiteavain, tällöin = 1 (b) Olkoon V(,C) = 5000, T() = 10,000 tasaisen jakauman oletuksella keskimäärin = 10,000/5,000 = 2 ( V(R,C) = C attribuutin arvojen lkm R:ssä) (c) Olkoon DOM(, C)=1,000,000 T() = 10,000 tällä oletuksella yhteisiä = 10,000 = 1 1,000,000 100 ( DOM(R,C) = C:n arvoalue R:ssä ) 25 26 Hakemistoliitoksen kokonaiskustannus (a) Yhteensä = 500+5000(1)1 = 5,500 (b) Yhteensä = 500+5000(2)1 = 10,500 (c) Yhteensä = 500+5000(1/100)1=550 Entä jos hakemisto ei mahdu muistiin? Esim: Olkoon.C hakemiston koko 201 lohkoa Pidä juuri + 99 lehtitason solmua muistissa Jokaisen läpikäynnin odotettu kustannus E = (0) 99 + (1) 101 0.5 200 200 27 28 7
Kokonaiskustannus Eli tähänmennessä tiedetään että = 500+5000 [läpikäynti + tietueen luku] = 500+5000 [0.5+2] tasainen jakauma oletuksena = 500+12,500 = 13,000 (tapaus b) ei peräkkäin Sisäkkäin 55,000 (paras) Lomitusliitos Sort-Merge liitos.c hakemisto.c hakemisto Tapaus (c): = 500+5000[0.5 1 + (1/100) 1] = 500+2500+50 = 3050 IOs peräkkäin Sisäkkäin 5500 Lomitusliitos 1500 Sort-Merge liitos 7500 4500.C hakemisto 5500 3050 550.C hakemisto 29 30 Esim 1(f):, peräkkäisiä, järjestämättömi Käytetään 100 solua Lue, hajauta, + kirjoita solut Hajautusliitos 100 -> Samoin -> Lue yksi solu; rakenna solutaulukko -> Lue vastaavat solut + hajauta + tutki muisti 10 lohkoa Toista kaikille soluille 31 32 8
Kustannus: Soluittain: Lue + kirjoita Lue + kirjoita Liitos: Lue, Yhteensä = 3 x [1000+500] = 4500 Yhteenveto Sisäkkäiset silmukat menetelmä sopii pienille relaatioille (verrattuna keskusmuistiin). Hajautusliitos yleensä paras yhtäsuuruusliitokseen, missä relaatiot eivät ole järjestetty eikä hakemistoja ole. Sort-Mege on hyvä jos ehtona ei yhtäsuuruus (esim,.c >.C). Jos relaatiot jo järjestetty, käytä lomitusliitosta. Jos hakemistoja on, ovat yleensä hyödyllisiä (riippuu siitä kuinka rajaava liitosehto on). 33 34 9