Indexen joost.vennekens@kuleuven.be
Probleem Snel gegevens terugvinden Gegevens moeten netjes geordend zijn Manier waarop hangt af van gebruik
Sequentieel Gesorteerde gegevens, die in volgorde overlopen moeten worden HCR TGO APH AVH JVE 1 (2) HCR 2 (3) TGO 3 (4) APH 4 (5) AVH 5 - JVE
Sequentieel Ver wijderen HCR TGO APH AVH JVE 1 (2) HCR 2 (4) TGO 3 - - 4 (5) AVH 5 - JVE
Sequentieel Toe voege n GDS HCR TGO AVH JVE 1 (3) HCR 2 (4) TGO 3 (2) GDS 4 (5) AVH 5 - JVE
Sequentieel Toe voege n GDS HCR TGO AVH JVE 1 (3) HCR 2 (4) TGO 3 (2) GDS 4 (5) AVH 5 - JVE
Sequentieel Toevoegen (2) 143 (5) DVT GDS DVT HCR TGO AVH JVE 1 (3) HCR 2 (4) TGO 3 (2) GDS 4 (143) AVH 5 - JVE
Sequentieel Wanordelijk 143 (5) DVT GDS DVT HCR TGO AVH JVE 1 (3) HCR 2 (4) TGO 3 (2) GDS 4 (143) AVH 5 - JVE
Sequentieel Reorganisatie 143 - JVE GDS DVT HCR TGO AVH JVE 1 (2) HCR 2 (3) GDS 3 (4) TGO 4 (5) AVH 5 (143) DVT
Index Terugvinden van specifieke data in sequentieel bestand Overlopen van hele bestand -> traag
Kleiner in RAM of minder blocks in te lezen HCR (1) GDS (3) TGO (2) AVH (4) DVT (143) JVE (5) Dense Index 1 (3) HCR 2 (4) TGO 3 (2) GDS 4 (143) AVH 5 - JVE 143 (5) DVT
Kleiner Gesorteerd houden Binair zoeken HCR (1) GDS (3) TGO (2) AVH (4) DVT (143) JVE (5) Dense Index 1 (3) HCR 2 (4) TGO 3 (2) GDS 4 (143) AVH 5 - JVE 143 (5) DVT
Binair zoeken 3? 2 3 8 17 45 78 91 133 256 3 < 45? 2 3 8 17 45 3 < 8? 2 3 8 Elke stap halveert rij rij(i+1) = rij(i) / 2 rij(i) = n / 2 i rij(i) = 1 voor i = log2(n)
Sparse Index Nog kleiner Binair + lineair zoeken Des te sparser Des te kleiner Des te meer lineair zoeken GDS (3) AVH (4) DVT (143) 1 (3) HCR 2 (4) TGO 3 (2) GDS 4 (143) AVH 5 - JVE 143 (5) DVT
Andere oplossing multi-level 1 (3) HCR GDS AVH DVT HCR GDS TGO AVH DVT JVE 2 (4) TGO 3 (2) GDS 4 (143) AVH 5 - JVE 143 (5) DVT
Meer indices -> trager aanpassen Secundaire index Dense 1 (3) HCR A205 C205 C208 A015 2 (4) TGO A208 3 (2) GDS A015 4 (143) AVH A205 5 - JVE A205
Bomen Datastructuur voor efficient zoeken én efficient aanpassen Ideaal voor index
Vertakkingsfactor Diepte Bomen 14 8 27 Wortel Interne knopen Bladeren 6 10 22 34 2 7 9 13 21 25 30 45 Zoeken? Toe voege n? Balans is belangrijk!
B+ boom van orde n Tussen (n-1)/2 en n-1 sleutels n=4 A015 A205 A208 A217
B+ boom van orde n Tussen n/2 en n kinderen (behalve wortel) 15 20 30 n=4 8 14 _ 2 3 6 8 10 12
Zoeken Minstens n 2 kinderen in knoop Op niveau i: minstens n 2 i knopen Boom van diepte d heeft minstens n 2 d bladeren Boom met w waardes kan nooit dieper zijn dan diepte log n/2 (w) -> grotere vertakkingsfactor is sneller zoeken (?) O(n logn/2(w))
Toe voege n Zoek juiste blad Voeg daar toe Op juiste plaats 15 20 30 Bv: 4 8 14 _ 2 6 _ 8 10 12
Toe voege n Zoek juiste blad Voeg daar toe Op juiste plaats 15 20 30 Bv: 4 8 14 _ 2 4 6 8 10 12 nieuwe emmer
Toe voege n Zoek juiste blad Als dit vol is Splits het op 15 20 30 Bv: 5 8 14 _ 2 4 6 8 10 12
Toe voege n Zoek juiste blad Als dit vol is Splits het op 15 20 30 Bv: 5 8 14 _ 2 4 _ 5 6 _ 8 10 12
Zoek juiste blad Als dit vol is Splits het op Toe voege n 15 20 30 En herhaal zonodig Bv: 5 5 8 14 2 4 _ 5 6 _ 8 10 12
Toe voege n In diepte = log n/2 (w) knopen Maximum n sleutels + pointers verplaatsen Dus nlog n/2 (w)
Zoek juiste blad Verwijderen Verwijder element uit emmer Als emmer leeg is, verwijder sleutel Bv: 4 15 20 30 8 14 _ 2 4 6 8 10 12
Zoek juiste blad Verwijderen Verwijder element uit emmer Als emmer leeg is, verwijder sleutel Bv: 4 15 20 30 8 14 _ 2 6 _ 8 10 12
Verwijderen Als te weinig sleutels overblijven Redistribueer sleutels 15 20 30 Bv: 6 8 14 _ 2 6 _ 8 10 12
Verwijderen Als te weinig sleutels overblijven Redistribueer sleutels 15 20 30 Bv: 6 8 14 _ 2 8 10 12
Verwijderen Als te weinig sleutels overblijven Redistribueer sleutels 15 20 30 Bv: 6 10 14 _ 2 8 _ 10 12 _
Verwijderen Als te weinig sleutels overblijven Of voeg samen 15 20 30 Bv: 8 10 14 _ 2 8 _ 10 12 _
Verwijderen Als te weinig sleutels overblijven Of voeg samen 15 20 30 Bv: 8 10 14 _ 2 10 12 _
Verwijderen Als te weinig sleutels overblijven Of voeg samen 15 20 30 Bv: 8 10 14 _??? 2 10 12
Als te weinig sleutels overblijven Verwijderen Of voeg samen 15 20 30 En herhaal! Bv: 8 14??? 2 10 12
Samengevat Zoeken, toevoegen, verwijderen: O(n logn/2(w)) Als n groter wordt Wordt diepte kleiner Maar constante factor groter
Ruimte In B+ boom zit data enkel in bladeren Dus interne knopen zijn pure overhead Variant: B boom Data in interne knopen Maakt wel toevoegen/verwijderen complexer
Hash functies Adres niet opslaan, maar berekenen uit sleutel 1 HCR A205 AVH h h( AVH ) = 4 2 TGO A208 3 GDS A015 4 AVH A205 5 JVE A205
Probleem Ideaal : h berekent voor elke sleutel een unieke geheugenplaats Maar ruimte van alle mogelijke sleutels is heel groot (of oneindig) 1 AAA - - AAB h h( AAB ) = 2 2 AAB - - 3 AAC - - 4 AAC - -
Oplossing Geheugenruimte opdelen in hashbuckets AAA AZZ h h( AAB ) = 1 1 2 3 4 AAA- AZZ BAA- BZZ CAA- CZZ DAA- DZZ
Probleem Mogelijkheid tot hash clashes APH h 1 AVH APH Niet 1 record, maar bv. gelinkte lijst AVH 2 3 4 Veel hash clashes, betekent traag zoeken
Hash functies Goede hash functie verdeelt sleutels zo uniform mogelijk over buckets Heel belangrijk: aantal buckets Te groot: lege buckets & verspild geheugen Te klein: te veel sleutels per bucket & traag Dus: hash functie aanpassen aan grootte van bestand (dynamisch vs. statisch)
Indexen voor speciale gevallen
Bitmap index 1 HCR M Man: 11101 Vrouw: 00010 2 TGO M 3 GDS M 4 AVH V 5 JVE M
Evaluatie Moeilijk te onderhouden Heel compact, dus past in RAM Gemakkelijk combineren van verschillende bitmap indexen
Combineren Man: 11101 Vrouw: 00010 & 29: 00001 30: 01000 01000 Man van 30 1 HCR M 2 TGO M 3 GDS M 4 AVH V 5 JVE M Populair in OLAP toepassingen hoeveel examplaren van produkt x verkocht in winkel y (en data verandert weinig)
Join index 1 A 2 B 3 C 4 D 5 E x 1 F 2 B 3 G 4 C 5 C (2,2) (3, 4) (3, 5) = 2 -> (2) 3 -> (4, 5)
Join index Opslaan: sequentieel, B+ boom, hash Ruilt geheugen voor snelheid bij herhaaldelijk berekenen zelfde join Kan incrementeel worden aangepast Kan eventueel ook in bitmap