DAV B04 - Databasteknik Indexering (kap 14)
Lagring av databaser på sekundärminne Att läsa/skriva på sekundärminne (hårddisk) är en långsam process jämfört med operationer i primärminnet Antalet diskaccesser (I/O) bör därför minimeras
Skrivning och läsning från sekundärminne Skrivning och läsning sker i form av sidor (= page/block) med standardstorlek, t ex 1024 bytes Databasposterna är ofta mindre än sidorna, t ex 100 bytes, vilket gör att man läser/skriver flera poster (i detta fall 10) på samma gång Önskvärt är att relaterade poster lagras nära varandra för att minska antalet accesser
Hämta en post från databasen DBHS bestämmer vilken lagrad post som behöver hämtas och ber filhanteraren att hämta posten Filhanteraren bestämmer vilken sida (block) som posten finns på och ber diskhanteraren att hämta den sidan Diskhanteraren bestämmer fysisk adress och ber om data från denna adress Data läses av diskhanteraren Den lagrade sidan returneras till filhanteraren Den lagrade posten returneras till DBHS
Indexering Ett index är en hjälpfil som gör det mer effektivt att söka efter en post i en datafil Indexet specificeras oftast på ett fält i datafilen Indexet kan t ex vara en fil av typen <fältvärde, pekare till datapost> Indexet är alltid sorterat
Exempel indexering Filen City (index) Filen Suppliers (data) Athens S1 Smith 20 London London S2 Jones 10 Paris London S3 Blake 30 Paris Paris S4 Clark 20 London Paris S5 Adams 30 Athens Filen City kallas för ett index till filen Suppliers, och filen Supplier sägs vara indexerad av filen City. Fältet City i filen Suppliers kallas det indexerade fältet
Indexering (forts) Indexfilen är oftast betydligt mindre än datafilen (består av färre diskblock) En binärsökning av indexfilen ger en pekare till den sökta posten Fördel: snabbare hämtning av data Nackdelar: långsammare uppdateringar, mer diskutrymme krävs
Typer av index Primary indexes (primärindex) Clustering indexes (klustrade index) Secondary indexes (sekundära index) Multilevel indexes (flernivå-index) Dynamic multilevel indexes, B-trees, B+-trees Ett index kan vara: dense (= index till varje post) nondense (= ej index till varje post).
Primary indexes Index knutet till primärnyckel Indexet består av ett primärnyckelvärde och en pekare till ett block Indexet får lika många rader som antalet diskblock datafilen består av Indexet är nondense
Clustering indexes Index knutet till ett icke-nyckelfält som har dubbletter En pekare från indexfilen för varje distinkt värde på clustering-fältet Det är vanligt att man reserverar ett helt block (eller flera) för varje värde på clustering-fältet Också nondense
Secondary indexes Indexfil med två värden, indexfält och pekare till post/block En datafil kan ha många sekundärindex, ett för varje attribut Kan vara dense eller nondense Tar mer plats och ger längre söktider än ett primärindex, men vinsten är större
Multilevel indexes Index med flera nivåer Vi behöver en andra nivå bara om den första nivån kräver mer en ett block för disklagring Vi behöver en tredje nivå bara om den andra nivån kräver mer en ett block för disklagring
B+-träd B-träd är en form av sökträd som möjliggör en effektiv insättning och borttagning av poster. Varje nod i trädet motsvarar ett diskblock Träden är alltid balanserade, dvs. alla löv ligger på samma nivå Gör att accesstiderna blir förutsägbara I ett B-träd kan datapekare finnas i alla inre noder och i löven medan B+-träd endast har datapekare i löven Dessutom finns pekare mellan löven i B+-träd vilket möjliggör sekventiell sökning
Ett B-träd av ordningen 3
Tumregler för indexering Indexera alltid primärnyckeln Inga sekundära index i små relationer Indexera attribut som ofta används som söknyckel Indexera främmandenycklar som används ofta Undvik att indexera attribut och relationer som uppdateras ofta Undvik att indexera attribut som består av långa teckensträngar