Transcript Indexering

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
1) DBHS bestämmer vilken lagrad post som behöver
hämtas och ber filhanteraren att hämta posten
2) Filhanteraren bestämmer vilken sida (block) som
posten finns på och ber diskhanteraren att hämta den
sidan
3) Diskhanteraren bestämmer fysisk adress och ber om
data från denna adress
4) Data läses av diskhanteraren
5) Den lagrade sidan returneras till filhanteraren
6) 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