Gegevensbanken 2012 Hashing en Indexstructuren II Bettina Berendt http://people.cs.kuleuven.be/~bettina.berendt/ Indexstructuren: Motivatie & Samenvatting 2 Waar zijn we? Les # 1 2 2 3 4,5 6 7 8 9 10 11 12 13 14,15 16 17 wie ED ED ED KV KV KV KV KV BB BB BB BB BB BB BB ED wat intro, ER EER, (E)ER naar relationeel schema relationeel model Relationele algebra & relationeel calculus SQL Programma's verbinden met gegevensbanken Functionele afhankelijkheden & normalisatie PHP Beveiliging van gegevensbanken Geheugen en bestandsorganisatie Hashing en Indexstructuren I Hashing en Indexstructuren II Queryverwerking Transactieverwerking en concurrentiecontrole Data mining en data warehousing XML, NoSQL Fysisch model / vragen 3 Wat doen als de keuken te klein is? 4 Wat doen als de keuken te klein is? * Het brood ligt in de slaapkamer * De eieren liggen in de eetkamer 5 Externe hashing Het brood ligt in de slaapkamer * De eieren liggen in de eetkamer 6 Twee problemen om te vermijden * Het brood ligt in de slaapkamer * De eieren liggen in de eetkamer . . . . * Het brood ligt in de slaapkamer * De volgende lijst ... * De eieren liggen in de eetkamer 7 Vraag: waarom deze twee opties? (MySQL als maar een voorbeeld) → dit zijn twee structurele types van indexen 8 De twee hoorcolleges: 2 foci Hashing en Indexstructuren I: – Basisideen; indexen als bestanden principes van de les over bestandsorganisatie toepassen Hashing en Indexstructuren II: – „slimmere ideen“; operaties op indexen hoe werkt het? 9 Agenda Dynamische hashing Uitbreidbare hashing Lineaire hashing Boomstructuren als indexen Indexen op meerdere velden 10 Agenda Dynamische hashing Uitbreidbare hashing Lineaire hashing Boomstructuren als indexen Indexen op meerdere velden 11 Externe “static” hashing: voor- en nadelen +• +• -• -• - record snel bereikbaar via sleutel ) toevoegen en weglaten redelijk eenvoudig ) Ketening opzoeken via ander dan sleutelveld is moeilijk ) doorlopen van bestand in sleutelvolgorde kan traag zijn ) • En: • vaste ruimte gereserveerd voor bestand (“static hashing”) • indien te groot: veel verloren ruimte • indien te klein: veel overloop snelheidsverlies • na een tijdje eventueel reorganisatie nodig 12 Dynamische bestandsuitbreiding • Sommige hashing technieken laten dynamische expansie van bestanden toe • aantal voorziene cellen groeit en krimpt met bestand • We behandelen 3 methoden: • “dynamische hashing“ • uitbreidbare (extendible) hashing • lineaire hashing 13 Dynamische & Uitbreidbare hashing: idee * als bruin: bucket 1 * als groen: bucket 2 * als bruin EN eieren: bucket 1 * als bruin EN brood: bucket 2 * als groen: bucket 3 14 Dynamische hashing: voorbeeld (1) • vb. (met 1 record per cel) • record A heeft hashwaarde 001101 • 1 cel, geen trie nodig • record B met hashwaarde 010011 wordt toegevoegd • Trie bouwen • Trie moet meteen naar eerste 2 bits kijken, want eerste bit is zelfde 15 Dynamische hashing: voorbeeld (2) • C met hashwaarde 111001 wordt toegevoegd • Bij weglaten van records evt. cellen weer samensmelten trie krimpt 16 Dynamische hashing: samenvatting • Begin met 1 cel • Bij overloop: cel splitst in twee • records verdeeld volgens 1-ste bit van hashwaarden • index wordt gebouwd • ("trie“ - van retrieve : boomvormige indexstructuur ) • interne knooppunten: binaire splitsing 0 - 1 • externe knooppunten: wijzen naar een cel • Telkens een cel overloopt: • splitsing van cel + aanpassing index volgens 1-ste bit van hashwaarde die een goede splitsing oplevert 17 Dynamische hashing: zoeken via een trie h := hashwaarde van record; t := topknoop van trie; i := 1; zolang t geen blad is: als de i-de bit van h een 1 is dan t := linkerkind anders t := rechterkind; i := i+1 zoek in de cel waarvan het adres in t zit 18 Agenda Dynamische hashing Uitbreidbare hashing Lineaire hashing Boomstructuren als indexen Indexen op meerdere velden 19 Uitbreidbare hashing: voorbeeld (1) Bron: Hakan (2009). File Organization. http://www.powershow.com/view/27b55-YzBlN/File_Organization 20 Uitbreidbare hashing: voorbeeld (2) 21 Uitbreidbare hashing: voorbeeld (3) 22 Uitbreidbare hashing: voorbeeld (4) 23 Uitbreidbare hashing: voorbeeld (5) 24 Uitbreidbare hashing: voorbeeld (6) 25 Uitbreidbare hashing: voorbeeld (7) 26 Uitbreidbare hashing: voorbeeld (8) 27 Uitbreidbare hashing: voorbeeld (9) 28 Uitbreidbare hashing: voorbeeld (10) 29 Taak: Uitbreidbare hashing: voorbeeld (11) 30 Uitbreidbare hashing: voorbeeld (12) 31 Uitbreidbare hashing: voorbeeld (13) 32 Uitbreidbare hashing: samenvatting • Index = tabel met 2d elementen • d = globale diepte van de index • eerste d bits van hashwaarde bepalen plaats in index • d' = lokale diepte van een cel • voor deze cel wordt enkel naar de eerste d' bits van de hashwaarde gekeken • d' ≤ d • Waarde van d kan met 1 verhogen of verminderen • grootte van tabel verdubbelt of halveert hierdoor • Tabel vergelijkbaar met "vervolledigde" trie (waarbij alle bladeren op hetzelfde niveau zitten) 33 Uitbreidbare hashing: vraag „Wat gebeurt er als er nog een 1001 toegevoegt wordt?“ (= x keer dezelfde sleutel, met x > bucket size m) • Antwoord 1: M.A. Weiss. Data structures and algorithms in C. retrieved from http://www.scribd.com/naresh_kumar_31/d/51164216/64-ExtendibleHashing, p. 363: “[…] there is the possibility of duplicate keys; if there are more than m duplicates, then this algorithm does not work at all. In this case, some other arrangements need to be made.” • Dit “andere arrangement” kan bv. ketening zijn, zoals voorgesteld als een mogelijkheid in het originele paper on Uitbreidbare Hashing: • Antwoord 2: Ronald Fagin, Jurg Nievergelt, Nicholas Pippenger, and H. Raymond Strong. 1979. Extendible hashing—a fast access method for dynamic files. ACM Trans. Database Syst. 4, 3 (Sept. 1979), 315-344 34 Uitbreidbare hashing: Voor- en nadelen +• + - extra ruimte voor tabel is klein • max grootte is 2k met k # bits in hashwaarden • uitbreiding van bestand relatief goedkoop • bij overloop slechts 1 cel te splitsen • enkel verdubbeling van tabel vraagt redelijk veel werk groeit exponentieel • 1 extra indirectie • eerst blok met index lezen, dan pas juiste cel, en daarna gegevensblok zelf • relatief klein nadeel 35 Agenda Dynamische hashing Uitbreidbare hashing Lineaire hashing Boomstructuren als indexen Indexen op meerdere velden 36 Lineaire hashing: idee • Gebruikt geen extra index • Beginsituatie: • M cellen genummerd 0 .. M-1 • Hashfunctie h0(k) = k mod M • Bij eerste overloop: • keten nieuw record vast aan zijn cel • splits cel 0 (dus niet noodzakelijk de overgelopen cel!) • records naar cel 0 en cel M volgens h1(k) = k mod 2M • Bij elke volgende overloop: • ketening • splits cel i-1 naar i-1 en M+i-1 volgens h1(k) 37 Lineaire hashing: eigenschappen • geen index, enkel aantal reeds gesplitste cellen n bijhouden • gebruik h1 voor eerste n cellen, h0 voor de andere • Zolang n < M : zelfde hashfuncties blijven toepassen • Wanneer n = M: • M := 2M; h0 := h1; n := 0 • laadfactor l = r / (d*N) • r = aantal aanwezige records, d = celdiepte, N = aantal cellen • wanneer l klein wordt, cellen weer samensmelten 38 Lineaire hashing: voorbeeld (1) • bucket capacity = 2 • collision resolution strategy: chaining • split rule: load factor > 0.7 • Load factor = r / (bfr * N) • r : current number of file records • bfr: max. number of records that can fit into a bucket • N: current number of file buckets • initially M = 4 (M: size of the primary area) • hash functions: hi(key) = key mod 2i M (i = 0, 1, 2, …) • Trace the insertion process of the following keys into a linear hashing file: 3, 2, 14, 1, 8, 4, 5, 10, 7, 24 Bron: Chen, Y. (2009). File Organization. http://ion.uwinnipeg.ca/~ychen2/databaseNotes/hashing.ppt (minimaal veranderd) 39 Lineaire hashing: voorbeeld (2) 0 1 2 3 Insert 3 Initial hash function: hi(key) = key mod 2i M, i=0 40 3 0 1 2 3 Lineaire hashing: voorbeeld (2) Insert 3 Initial hash function: hi(key) = key mod 2i M, i=0 41 3 0 1 2 2 3 Lineaire hashing: voorbeeld (3) Insert 3 Insert 2 3 Initial hash function: hi(key) = key mod 2i M, i=0 42 3 0 1 2 2 2 14 3 Lineaire hashing: voorbeeld (4) Insert 3 Insert 2 3 3 Initial hash function: Insert 14 hi(key) = key mod 2i M, i=0 43 3 0 1 1 2 3 Lineaire hashing: voorbeeld (5) Insert 3 Insert 2 2 14 3 2 14 3 2 14 3 Initial hash function: Insert 14 hi(key) = key mod 2i M, i=0 Insert 1 44 3 0 1 2 2 1 8 1 3 Insert 3 Insert 2 3 2 14 3 2 14 3 2 14 Lineaire hashing: voorbeeld (6) Initial hash function: Insert 14 hi(key) = key mod 2i M, i=0 Insert 1 Insert 8 3 45 Lineaire hashing: voorbeeld (7) The first phase – phase0 • when inserting the 6th record (4) we would have 4 8 1 0 1 2 14 3 2 3 n=0 before the split (n is the point to the bucket to be split.) • but the load factor 6/8= 0.75 > 0.70 and so bucket 0 must be split (using h1 = Key mod 2M): 8 2 14 1 0 1 2 3 n=1 after the split load factor: 6/10=0.6 no split 4 3 4 46 Lineaire hashing: voorbeeld (7) The first phase – phase0 • when inserting the 6th record (4) we would have 4 8 1 0 1 2 14 3 2 3 n=0 before the split (n is the point to the bucket to be split.) • but the load factor 6/8= 0.75 > 0.70 and so bucket 0 must be split (using h1 = Key mod 2M): 8 2 14 1 0 1 2 3 n=1 after the split load factor: 6/10=0.6 no split 4 3 4 47 Lineaire hashing: voorbeeld (8) insert(5) 8 0 8 0 1 1 1 5 1 2 14 3 2 3 2 14 3 2 3 4 4 4 n=1 load factor: 7/10=0.7 no split 4 48 Lineaire hashing: voorbeeld (8) insert(5) 8 0 8 0 1 1 1 5 1 2 14 3 2 3 2 14 3 2 3 4 4 4 n=1 load factor: 7/10=0.7 no split 4 49 Lineaire hashing: voorbeeld (9) insert(10) 8 0 8 1 5 1 1 5 2 14 3 2 3 2 14 3 4 4 4 n=1 load factor: 8/10=0.8 split using h1. overflow 10 50 Lineaire hashing: voorbeeld (9) insert(10) 8 0 8 1 5 1 1 5 2 14 3 2 3 2 14 3 4 4 4 n=1 load factor: 8/10=0.8 split using h1. overflow 10 51 Lineaire hashing: voorbeeld (9) 8 0 1 1 2 14 3 2 3 4 4 5 5 overflow 10 n=2 load factor: 8/12=0.66 no split 52 Lineaire hashing: voorbeeld (10) insert(7) 8 1 2 14 3 4 n=2 load factor: 9/12=0.75 split using h1. overflow 10 8 0 1 1 5 2 14 3 7 2 3 4 4 5 5 overflow 10 53 Lineaire hashing: voorbeeld (10) 8 1 2 10 3 7 4 5 14 n=3 load factor: 9/14=0.642 no split. insert(24) 8 1 2 10 3 7 4 5 14 54 Taak: Lineaire hashing: voorbeeld (11) 8 1 2 10 3 7 4 5 14 n=3 load factor: 9/14=0.642 no split. insert(24) 8 1 2 10 3 7 4 5 14 55 Lineaire hashing: voorbeeld (11) 8 24 1 2 10 3 7 4 5 14 n=3 load factor: 10/14=0.71 split using h1. 8 24 1 2 10 3 4 5 14 7 56 Lineaire hashing: voorbeeld (8) 8 24 1 2 10 3 7 4 5 14 n=3 load factor: 10/14=0.71 split using h1. 8 24 1 2 10 3 4 5 14 7 57 Op dit moment hebben we de volgende structuur: Een lineaire hash met • file level j = 1 • 8 cellen • h0 = k mod (2j * 4) = k mod (21 * 4) = k mod 8 • (de naastvolgende h1 wordt h1 = k mod (22 * 4) = k mod 16) • n=0 Door het laatste wordt het mogelijk dat elke cel herhaald gesplitst wordt en dan ook waarden die bij de eerste splitsing niet worden herverdeeld nu worden herverdeelt! Vb: sleutelwaarde 18 18 mod 4 = 18 mod 8 = 18 mod 16 = 2 18 blijft lang in cel 2, misschien in een overloopgebied, en wordt niet herverdeeld MAAR: als h1 = k mod 32 bereikt wordt, dan gaat 18 naar cel 18 58 Lineaire hashing: zoeken als n=0 dan m := hj(k) anders m := hj(k); als m<n dan m := hj+1(k); zoek in de cel met hashwaarde m (en evt. in de overloop ervan) 59 Agenda Dynamische hashing Uitbreidbare hashing Lineaire hashing Boomstructuren als indexen Indexen op meerdere velden 60 Algoritme voor zoeken in ijle primaire multiniveau-index naar record met sleutel K p := adres van top-blok van index; voor j := t tot 1: lees blok met adres p (op niveau j in index); zoek in p een record i zodat Kj(i) <= K < Kj(i+1); p := pj(i); lees het blok gegevens met adres p; zoek in p naar het record met sleutel K 61 Operaties in multi-niveau indexen • Weglaten: – door te markeren • Toevoegen: – m.b.v. overloopgebieden • Na een tijdje: reorganisatie – heel het bestand wordt sequentieel doorlopen en herschreven naar nieuw bestand – overloop en markeringen worden opgeruimd – nieuwe index wordt gebouwd op nieuw bestand + • Voordelen: – snelle toegang tot bestand, toevoegingen en weglatingen tamelijk efficiënt • Nadelen: - – overloop werkt vertragend, verkwisting van ruimte, geregelde reorganisatie vraagt tijd 62 Boomstructuren als indexen • Binaire zoekboom is geordend: – 1 waarde in knoop – in linkerdeelboom enkel kleinere waarden – in rechterdeelboom enkel grotere waarden • Opzoeken van waarde vraagt tijd evenredig met hoogte h van boom – "gewoonlijk" : • h log2 n • met n = # waarden in de boom + – dus: zoeken is efficiënt +– Boom groeit en krimpt naarmate van de gegevens dynamisch 63 ... maar ... 64 Evenwichtigheid • Aanpassen van boom (toevoegen, weglaten): ook tijdscomplexiteit evenredig met h – gemiddeld dus ook efficiënt • MAAR: aanname van "evenwichtigheid" van bomen wordt gemaakt! – Niet onmogelijk dat h n i.p.v. log2 n – vb. bij eenvoudig toevoeg-algoritme dat waarden reeds in volgorde krijgt • concept van evenwichtige zoekbomen – toevoegen, weglaten worden zo geïmplementeerd dat evenwicht steeds bewaard blijft 65 B-bomen • B-boom van orde p (p > 2) is zoekboom waarvoor : – elke inwendige knoop heeft hoogstens p kinderen – de wortel heeft minstens 2 kinderen, elke andere knoop minstens p / 2 – alle bladeren zitten even diep – "waarde" in B-boom = sleutel + adres – speciale gevallen: 2-3 bomen, 3-5 bomen, ... – beperkingen i.v.m. min en max aantal kinderen garanderen • redelijke gebalanceerdheid • beperkte verspilling van geheugen 66 Adressen in knopen van B-bomen • Adres is een blokadres of recordadres – recordadres = blokadres + positie van record in blok • voor niet-sleutelveld: – adres van blok met wijzers naar adressen (cfr. eerdere voorbeelden) extra indirectie 67 Maximale hoogte van B-bomen • orde p minstens d = p / 2 deelbomen per knoop • op niveau 1 (onder wortel) – minstens 2 knopen, • op niveau i – minstens 2 di-1 knopen 2 di-1 (d-1) waarden h logd ( (n + 1) / 2 ) 68 B-bomen: abstract en voorbeeld 69 Voorbeeld 2 (1): Berekening orde B-boom • Stel: – grootte van veld waarop gezocht wordt V = 9 bytes – B = 512 bytes – recordadres Pr = 7 bytes, blokadres P = 6 bytes • 1 knoop van B-boom moet in 1 blok passen – max aantal deelbomen p van een knoop: • • • • p * P + (p - 1) * (Pr + V) B 6 p + 16 (p - 1) 512 p 24 meestal nog wat extra (administratieve) info in blok kies p = 23 70 Voorbeeld 2 (2): Aantal blokken en diepte – empirisch onderzoek toont: B-boom gemiddeld 69% vol • dus: – Gemiddeld 0.69p = 0.69 x 23 = 16 wijzers • gemiddelde fan-out fo = 16 • gemiddeld aantal waarden per knoop = 15 – wortel : 15 sleutels – 1 niveau onder wortel : • 16 knopen 16 * 15 = 240 sleutels – 2 niveaus diep: • 162 = 256 knopen, 3 840 sleutels – 3 niveaus diep: • 163 = 4 096 knopen, 61 440 sleutels – totaal voor 3 niveaus: • 61 440 + 3 840 + 240 + 15 = 65 535 71 Extra informatie (niet voor het examen) „empirisch onderzoek toont: B-boom gemiddeld 69% vol“ - hoe weten we dat? bron: Author: Yao, Andrew Chi-Chih, Primary Title: On random 2–3 trees Journal Name: Acta Informatica, Cover Date: 1978-06-01 Publisher: Springer Berlin / Heidelberg, Start Page: 159, End Page: 170 Volume: 9, Issue: 2, Url: http://dx.doi.org/10.1007/BF00289075 Verder werk bv. Hier: T. Johnson and D. Shasha. 1989. Utilization of B-trees with inserts, deletes and modifies. In Proceedings of the eighth ACM SIGACT-SIGMOD-SIGART symposium on Principles of database systems (PODS '89). ACM, New York, NY, USA, 235-246. DOI=10.1145/73721.73745 http://doi.acm.org/10.1145/73721.73745 http://portal.acm.org/citation.cfm?id=73745 72 Wanneer B-bomen gebruiken? • Gebruik van B-bomen als primaire bestandsorganisatie – dus niet voor index op bestand, maar bestand zelf – 1 waarde in knoop = sleutel + het hele record - • Enkel goed bruikbaar indien – klein aantal records – kleine recordgrootte • Anders fo te klein # niveaus van boom te groot inefficiënt 73 Operaties en hun kost/efficiëntie + + - • Opzoeken : O (logd n) • Toevoegen, weglaten: – eerst positie opzoeken – wijziging aanbrengen en doorvoeren – alles in O (logd n) tijd • Sequentiele verwerking: – boom doorlopen in in-orde (links, knoop, rechts) – interne knopen vaak opnieuw gelezen, tenzij ze in centraal geheugen onthouden worden – kan beter : met B+-bomen 74 B+-bomen • Bij B-bomen: – sommige record-wijzers in interne knopen, andere in bladeren • Bij B+-bomen: – interne knopen bevatten enkel sleutels, geen adressen van records • recordadressen enkel in de bladeren • interne knopen bevatten enkel "wegwijzers" • orde pi van interne knopen is nu groter betere prestaties; orde pb van bladeren ongeveer even groot • extra: – aan het eind van een blad wijzer naar volgend blad • maakt sequentieel doorlopen eenvoudiger 75 B+-bomen: abstract 76 Voorbeeld 3 (1): Berekening orde B+-boom • Gegeven: – V = 9 bytes, B = 512 bytes, Pr = 7 bytes, P = 6 bytes • orde van interne knopen: – pi * P + (pi - 1) * V B – 6 pi + 9 (pi - 1) 512 – pi = 34 (cfr. 23 voor B-boom) • orde van bladeren: – – – – pb * (Pr + V) + P B pb * ( 7 + 9 ) + P B 16 pb + 6 512 pb = 31 77 Voorbeeld 3 (2): Aantal sleutels en diepte – Stel 69% vol – dan: • 0.69 * 34 = 23 wijzers per knoop (22 waarden) • in blad: 0.69 * pb = 0.69 * 31 = 21 recordwijzers – gemiddeld aantal sleutels op elk niveau: • • • • wortel: 1 knoop, niveau 1: 23 knopen, niveau 2: 529 knopen, bladeren: 12 167 knopen, 22 sleutels 506 sleutels 11 638 sleutels 255 507 recordwijzers – Vgl. met 65 536 recordwijzers voor B-boom 78 Algoritmes • Algoritmes voor – zoeken in B+-boom en – voor aanpassing van B+-boom bij toevoegen / weglaten van gegevens – Gedetailleerde algoritmes in boek 79 B+-boom: Opzoeken van een sleutelwaarde { K = gezochte sleutel } n := blok dat wortel van B+-boom bevat; lees blok n; zolang n geen blad is: q := #deelbomen van n; v0=- , v1..vq-1 waarden in knoop, vq=+ kies i zo dat vi < K <= vi+1; n := bi; lees blok n; zoek in n een koppel (vi, Pri) met vi=K; indien gevonden: lees record met adres Pri anders: meld 'niet gevonden' 80 B+-boom: Toevoegen van een record met sleutel K • zoek blad waar sleutel hoort • indien niet vol: voeg sleutel gewoon toe • indien blad al vol: splits blad – – – – 1e helft blijft, 2e helft naar nieuw blad voeg sleutel toe aan juiste blad pas ook bladwijzers aan voeg laatste waarde van blad 1 in ouderknoop toe • herhaal zolang ouderknoop overvol is: – splits knoop : helft van waarden naar nieuwe knoop; verhuis laatste waarde van 1e knoop naar ouder 81 Taak: toevoegen van ... 8, 5, 1, 7, 3, 12, 9, 6 … aan een leeg B+-boom met orde 3 (inwendige knopen) en 2 (bladeren) 82 83 84 Alternatieve oplossing 85 B+-boom: Verwijderen van een sleutel K uit gegevens • zoek blad met sleutel, verwijder sleutel daaruit • indien sleutel ergens in interne knopen voorkomt: – vervang door waarde net links ervan • indien onderloop (te weinig waarden in blad): – steel enkele waarden van naburig blad (en pas bovenliggende knoop aan) – indien nog niet voldoende: voeg 2 bladeren samen – verwijder 1 wegwijzer uit bovenliggende knoop • indien onderloop in interne knoop: – herverdeel of voeg samen (met evt. verwijdering van 1 waarde uit bovenliggende knoop...) 86 Taak: verwijderen van ... 6, 8, 5 (uit opgebouwde boom versie 1) of 5, 12, 9 (uit opgebouwde boom versie 2) 87 88 89 B*-bomen • elke knoop tenminste 2/3 gevuld (i.p.v. ½) – splits slechts wanneer 2 naburige knopen vol zijn 90 Praktijkvoorbeeld: VSAM • VSAM = Virtual Storage Access Method (IBM) – Gebaseerd op B+-bomen – Ontworpen om aan meerdere criteria te voldoen: • sequentiële toegang • toevoegen, weglaten, opzoeken : O (log n) • geen reorganisatie nodig – Blokken met gegevens die bij 1 blad horen, allemaal op 1 cilinder tijdwinst – Andere aanpassingen om efficiëntie verder te verhogen (index apart plaatsen, sleutelcompressie, ...) 91 Agenda Dynamische hashing Uitbreidbare hashing Lineaire hashing Boomstructuren als indexen Indexen op meerdere velden 92 Indexen op meerdere velden • vb. index op combinatie van leeftijd en departement – "geef alle werknemers van dept. 5 met leeftijd 60" – met aparte indexen: eerst verz. werknemers van dept. 5 (A), dan verz. met leeftijd 60 (B), vervolgens doorsnede nemen niet zo efficiënt • resultaat waarschijnlijk veel kleinere verzameling dan A en B – Samengestelde index veel efficiënter: • levert direct het goede resultaat • Hoe indexeren op meerdere velden? 93 Hoe de velden combineren? (1) • Meerdere velden samen als 1 veld beschouwen – Samengestelde waarden: ordening? • lexicografisch : cf. alfabetische ordening • (p1, q1) < (p2, q2) p1 < p2 OF (p1 = p2 en q1< q2) • enz. voor meer componenten • Hashing op samengestelde velden: "partitioned hashing" – resultaat hashfunctie is combinatie van resultaten van aparte hashfuncties op componenten – bv. • 5 101; • 60 10110 (5, 60) 10110110 – geen aparte toegangsstructuren voor componenten nodig (maar: enkel voor "="-tests) 94 Hoe de velden combineren? (2) • i.p.v. rij met adressen : matrix met adressen – indices voor matrix = waarden van componenten • evt. code voor interval van waarden – vb. matrix M: M5,5 bevat wijzer naar cel met wijzers naar records waarvoor dept = 5 en leeftijd > 50 95 Fysische en logische indexen • Naast bomen ook hashing of andere datastructuren mogelijk voor index • In onze bespreking: fysische indexen – steeds fysische adressen gebruikt – indien deze veel wijzigen: probleem – logische index verhelpt dit: • i.p.v. fysisch adres, wordt sleutel voor primaire bestandsorganisatie teruggegeven • dan zoeken volgens primaire structuur – nadeel van logische index: 1 extra indirectie 96 Indexen: samenvatting • Grootste voordeel van indexen: – kunnen in principe gebruikt worden met eender welke primaire bestandsorganisatie – bemerk dat primaire organisatie enkel efficiënt zoeken op 1 veld mogelijk maakt • Indexen o.a. handig voor opleggen van uniciteit van velden (naast efficiënt opzoeken van waarden) • Bestand met secundaire index op elk veld = "volledig geïnverteerd bestand" (fully inverted file) 97 Vooruitblik Dynamische hashing Uitbreidbare hashing Lineaire hashing Boomstructuren als indexen Indexen op meerdere velden Queryverwerking 98 Vraag: waarom deze twee opties? (MySQL als maar een voorbeeld) → dit zijn twee structurele types van indexen 99 Bronnen • Deze slides zijn gebaseerd op Henk Olivié‘s slides voor Gegevensbanken 2009 en op Elmasri & Navathe, Fundamentals of Database Systems, Addison Wesley / Pearson, 5e editie 2007. • Alle kopieën zonder bronspecificatie: Elmasri & Navathe, Fundamentals of Database Systems, Addison Wesley / Pearson, 5e editie 2007. • Verdere figuren: bronnen zie “Powerpoint comments field” • Bedankt iedereen! 100