Predavanja (7.dio) - FSR web : www.fsr.ba

INDEKSIRANJE
prof.dr.sc. Dražena Gašpar
27.05.2013.
Osnovni koncepti
Mehanizam indeksiranja koristi se za ubrzavanje pristupa
željenim podacima.
Npr., katalog autora u knjižnici
Ključ pretraživanja – atribut ili set atributa koji se koristi za
pronalaženje slogova u datoteci.
Indeksna datoteka sastoji se od slogova (nazvanih indeksni
ulazi) oblika
Ključ pretraživanja
pointer
Indeksne datoteke su u pravilu znatno manje od originalnih
DVA osnovna tipa indeksa:
Uređeni indeksi: ključevi pretraživanja pohranjuju se u
sortiranom redosljedu
Hash indeksi: ključevi pretraživanja distribuiraju se ravnomjerno
po “pretincima” korištenjem “hash funkcije”.
Metrika evaluacije indeksa
Različiti tipovi pristupa efikasno podržani
Npr.
Slogovi sa specifičnom vrijednošću atributa
Ili slogovi s vrijednošću atributa koja se nalazi na definiranom
rasponu vrijednosti.
Vrijeme pristupa
Vrijeme dodavanja (insert)
Vrijeme brisanja (delete)
Dodatni prostor
Uređeni indeksi
Tehnike indeksiranja evaluiraju se na temelju:
Kod uređenih indeksa, indeksni ulazi se pohranjuju na način da
se sortiraju po vrijednosti ključa pretraživanja. Npr. Katalog
autora u knjižnici.
Primarni indeks: kod sekvencijalno uređenih datoteka, indeks
čiji ključ pretraživanja specificira sekvencijalni redosljed
datoteke.
Također se naziva indeks klasteriranja
Ključ pretraživanja primarnog indeksa je obično, ali ne i nužno
primarni ključ.
Sekundarni indeks: indeks čiji ključ pretraživanja specificira
redosljed različit od sekvencijalnog redosljeda datoteke. Također
se naziva indeks ne-klasteriranja .
Indeks-sekvencijalna datoteka: uređena sekvencijalna datoteka
s primarnim indeksom.
Guste indeksne datoteke
Gusti indeks — Indeks slog se pojavljuje za svaku vrijednost
ključa pretraživanja u datoteci.
Razrijeđene indeksne datoteke
Razrijeđeni indeks : sadrži indeksne slogove za samo neke
vrijednosti ključa pretraživanja.
Primjenjivo kada su slogovi sekvencijalno uređeni po ključu
pretraživanja
Za lociranje sloga s vrijednošću ključa pretraživanja K :
Pronaći slog indeksa s najvećom vrijednošću ključa pretraživanja < K
Pretraživati datoteku sekvencijalno polazeći od sloga na koji indeksni
slog pokazuje
Manje prostora i manje dodatnog održavanja za dodavanje i
brisanje.
Generalno sporiji od gustog indeksa za lociranje slogova.
Dobra kombinacija: razrijeđeni indeks sa indeks ulazom za svaki
blok datoteke, odgovara najmanjoj vrijednosti ključa pretraživanja u
bloku.
Primjer razrijeđene indeksne datoteke
Višerazinski indeks
Ako primarni indeks ne staje u memoriju, pristup postaje skup.
Za smanjivanje broja disk pristupa indeksnim slogovima, tretirati
primarni indeks koji se drži na disku kao sekvencijalnu datoteku i
konstruirati razrijeđeni indeks nad njom.
Vanjski indeks – razrijeđeni indeks primarnog indeksa
Unutarnji indeks – primarni indeks datoteke
Ako je čak i vanjski indeks prevelik da stane u memoriju, još
jedna razina indeksa se može kreirati itd..
Indeksi na svim razinama moraju se ažurirati pri dodavanju ili
brisanju datoteke.
Višerazinski indeks
Ažuriranje indeksa:
indeksa: Brisanje
Ako je obrisani slog jedini slog u datoteci s tom vrijednošću
ključa pretraživanja, ključ pretraživanja se također briše iz
indeksa.
Brisanje indeksa jedne razine:
Gusti indeksi – brisanje ključa pretraživanja je slično brisanju sloga
datoteke.
Razrijeđeni indeksi – ako ulaz za ključ pretraživanja postoji u
indeksu, on se briše tako što se zamijeni ulaz u indeksu sa
sljedećom vrijednošću ključa pretraživanja u datoteci (u redosljedu
ključa pretraživanja). Ako sljedeća vrijednost ključa pretraživanja
već ima ulaz u indeks, ulaz se briše, umjesto da bude zamijenjen..
Ažuriranje indeksa:
indeksa: dodavanje
Indeks jedne razine – dodavanje (insert) :
Izvršava pregled koristeći vrijednost ključa pretraživanja koja se
pojavljuje u slogu koji treba dodati.
Gusti indeksi – ako se vrijednost ključa pretraživanja ne pojavljuje u
indeksu, dodaje je.
Razrijeđeni indeksi – ako indeh smješta ulaz za svaki blok datoteke,
ne treba raditi nikakve izmjene indeksa, izuzev ako se kreira novi
blok. U tom slučaju, prva vrijednost ključa pretraživanja koja se
pojavljuje u novom bloku dodaje se indeksu.
Višerazinski algoritmi dodavanja (kao i brisanja) su jednostavno
proširenja algoritama jedne razine.
Sekundarni
Sekundarni indeksi
Često se žele pronaći svi slogovi čija vrijednost za
neko polje (koje nije ključ pretraživanja primarnog
indeksa ) zadovoljavaju neki uvjet.
Primjer 1: U bazi podataka kupaca pohranjenoj
sekvencijalno po šifri kupca, žele se pronaći svi kupci
određene regije
Primjer 2: kao gore, ali se žele pronaći svi kupci sa
određenim prometom
Može se definirati sekundarni indeks sa slogom
indeksa za svaku vrijednost ključa pretraživanja; slog
indeksa pokazuje na pretinac koji sadrži pokazivače na
sve aktualne slogove s tom određenom vrijednošću
ključa pretraživanja.
Sekundarni
Sekundarni indeks za polje promet
kupca
Primarni
Primar
ni i sekundanri indeksi
Sekundarni indeksi moraju biti gusti.
Indeksi nude značajne koristi kod pretraživanja slogova.
Kada se datoteka mijenja, svaki indeks datoteke mora biti
ažuriran. Ažuriranje indeksa nameće dodatne troškove
modificiranja baze podataka.
Sekvencijalno skeniranje (scan) koje koristi primarni indeks je
efikasno, ali je sekvencijalno skeniranje koje koristi sekundarni
indeks skupo
Svaki pristup slogu može dohvatiti novi blok s diska
B+- Stabla indeksne datoteke
B+- stabla indeksa su alternativa indeks-sekvencijalnim datotekama.
Nedostaci indeks-sekvencijalnih datoteka: performanse
opadaju kako datoteka raste, pošto se kreiraju mnogi prepuni
blokovi. Periodično reorganiziranje čitave datoteke je
potrebno.
Prednosti B+-stabla indeksnih datoteka: automatski se sama
reorganizira kroz male, lokalne promjene tijekom dodavanja i
brisanja. Reorganiziranje čitave datoteke nije potrebno kako
bi se održale performanse.
Nedostaci B+- stabala: ekstra troškovi dodavanja i brisanja,
dodatni prostor.
Prednosti B+- stabala su veće od nedostataka i vrlo često se
koriste.
B+- Stabla indeksne datoteke
B+- stablo je korijensko stavlo koje ispunjava sljedeće:
Svi putevi od korijena do lista su iste duljine
Svaki čvor koji nije korijen ili list ima između [n/2] i n djece.
List čvor ima između [(n–1)/2] i n–1 vrijednosti
Posebni slučajevi:
Ako korijen nije list, on ima bar 2 djeteta.
Ako je korijen list (tj. nema drugih čvorova u stablu), može
imati između 0 i (n–1) vrijednosti.
B+- stablo – struktura čvora
Tipični čvor
Ki su vrijednosti ključa pretraživanja
Pi su pointeri na djecu (za čvorove bez listova) ili pointeri na slogove
ili pretince slogova (za čvorove listova).
Ključevi pretraživanja u čvoru su uređeni
K1 < K2 < K3 < . . . < Kn–1
Čvorovi listova u B+-stablima
Svojstva čvora listova:
Za i = 1, 2, . . ., n–1, pointer Pi ili pokazuje na slog datoteke s
vrijednošću ključa pretraživanja Ki, ili na pretinac pointera za slogove
datoteke, gdje svaki slog ima vrijednost ključa pretraživanja Ki.
Struktura pretinaca potrebna je samo ako ključ pretraživanja ne
formira primarni ključ.
Ako su Li, Lj čvorovi listova i i < j, Li’ vrijednosti ključa pretraživanja su
manje od Lj’ vrijednosti ključa pretraživanja
Pn pokazuje na sljedeći čvor listova u redosljedu ključa pretraživanja
Čvorovi bez listova u B+- stablima
Čvorovi bez listova formiraju višerazinski razrijeđeni indeks na
čvorovima listova. Za čvor bez listova s m pointera:
Svi ključevi pretraživanja u pod-drvu na koje P1 pokazuje su su
manji od K1
Za 2 ≤ i ≤ n – 1, svi ključevi pretraživanja u pod-drvu na koje Pi
pokazuje imaju vrijednosti veće od ili jednake Ki–1 i manje od Km–1
Primjer B+- stabla
B+- stablo za datoteku kupci (n = 3)
Primjer B+- stabla
B+- stablo za datoteku kupaca (n - 5)
Čvorovi listova moraju imati između 2 i 4 vrijednosti
((n–1)/2 i n –1, za n = 5).
Čvorovi bez listova koji nisu korijenski moraju imati
između 3 i 5 djece ((n/2 i n za n =5).
Korijen mora imati najmanje 2 djece.
Napomene za B+- stabla
Kako se povezivanje među čvorovima radi pomoću pokazivača, ,
“logički” blizu blokovi ne moraju biti “fizički” blizu.
Razine bez listova B+- stabla formiraju hijerarhiju razrijeđenih
indeksa.
B+- stablo sadrži relativno mali broj razina (logaritamski s
obzirom na veličinu glavne datoteke), tako da se pretraživanja
mogu izvršavati efikasno.
Dodavanja i brisanja glavne datoteke mogu se raditi efikasno
pošto se indeks može rekonstruirati u logaritamskom vremenu.
Upiti nad B+- stablima
Pronači sve slogove s vrijednošću ključa pretraživanja k.
1. Početi s korijenskim čvorom
1. Ispitati čvor za najmanju vrijednost ključa pretraživanja > k.
2. Ako takva vrijednost postoji, pretpostaviti da je Kj. Zatim
slijediti Pi do dijete čvora
3. Inače k ≥ Km–1, gdje je m pokazivača u čvoru. Zatim slijediti
Pm do dijete čvora.
2. Ako čvor do kojega se došlo slijedeći gornji pointer nije list
čvor, ponoviti gornju proceduru na čvoru i slijediti odgovarajući
pointer.
3. Eventualno dosegne list čvor. Ako je za neko i, ključ Ki = k
slijediti pointer Pi do željenog sloga ili pretinca. Inače ne
postoji nijedan slog s vrijednosšću ključa pretraživanja k.
Upiti nad B+- stablima
Pri procesiranju upita put prolazi stablom od korijena do
nekog čvora lista.
Ako ima K vrijednosti ključa pretraživanja u datoteci, put
nije dulji od  logn/2(K).
Čvor je općenito iste veličine kao disk blok, obično 4
kilobytes, i n je obično oko 100 (40 byte-ova po indeks
ulazu).
S 1 milijun vrijednosti ključa pretraživanja i n = 100,
najviše log50(1,000,000) = 4 čvora su ta kojima se
pristupa u pregledu.
Suprotnost ovome je balansirano binarno stablo s 1
milijun vrijednosti ključa pretraživanja — oko 20 čvorova
je tih kojima se pristupa u pregledu
Gornja razilka je značajna pošto svaki čvor pristup može
trebati disk I/O, koji košta oko 20 milisekunda!
Ažuriranje B+- stabala:
stabala: dodavanje
Pronaći list čvor u kojemu će se pojaviti vrijednost ključa
pretraživanja
Iako je vrijednost ključa pretraživanja već u čvoru lista slog se
dodaje datoteci i ako je neophodno pointer se dodaje u pretinac.
Ako vrijednost ključa pretraživanja nije tamo, onda se slog
dodaje glavnoj datoteci i kreira pretinac ako je neophodno.
Zatim:
Iako ima mjesta u čvoru lista, dodati (vrijednost ključa, pointer) par u
čvor lista
Inače, razdvojiti čvor (zajedno s novim (vrijednost ključa, pointer)
ulazom).
Ažuriranje B+- stabala:
stabala: Dodavanje
Razdavjanje čvora:
uzeti n(vrijednost ključa pretraživanja, pointer) parova (uključujući i
onaj koji se dodaje) u sortiranom redosljedu. Smjestiti prvih  n/2  u
originalni čvor, a ostatak u novi čvor.
Neka je novi čvor p, i neka je k najmanja vrijednost ključa u p.
Dodati (k,p) u “roditelj” čvora koji se razdvaja. Ako je roditelj čvor
pun, razdvojiti ga i nastaviti s razdvajanjem.
Razdvajanje čvorova se nastavlja prema gore dok se ne pronađe čvor
koji nije pun. U najgorem slučaju korijenski čvor se mora razdvojiti
povećavajući težinu stabla za 1.
Rezultat razdvajanja čvora koji sadrži Brighton i Downtown
pri dodavanju Clearview
Ažuriranje B+- stabala:
stabala: dodavanje
B+-stablo prije i nakon dodavanja “Clearview”
Ažuriranje B+-stabala:
stabala: Brisanje
Pronaći slog koji treba obrisati, ukloniti ga iz glavne
datoteke i iz pretinca (ako postoji)
Ukloniti (vrijednost ključa pretraživanja, pointer) iz
čvora lista ako nema pretinca ili ako pretinac postaje
prazan
Ako čvor ima premalo ulaza zbog uklanjanja, a ulazi u
nod odgovaraju jednom čvoru, onda
Dodati sve vrijednosti ključa pretraživanja iz dva čvora u
jedan čvor (onal na lijevoj strani), i obrisati drugi čvor.
Obrisati par (Ki–1, Pi), gdje je Pi pointer na obrisani čvor,
iz njegovofg roditelja rekurzivno koristeći gornju
proceduru.
Ažuriranje B+- stabala:
stabala: Brisanje
Inače, ako čvor ima premalo ulaza zbog uklanjanja, a ulazi u
čvor odgovaraju jednom čvoru ili djetetu, onda
Redistribirati pointere između čvora i djeteta tako da oboje imaju
više od minimalnog broja ulaza.
Ažurirati odgovarajuću vrijednost ključa pretraživanja u roditelj
čvoru.
Brisanja čvora mogu ići kaskadno prema gore do čvora koji ima
n/2  ili je više pointera pronađeno. Ako korijenski čvor ima
samo jedan pointer nakon brisanja, on se briše i samo dijete
postaje korijen.
Primjer B+- stabla - Brisanje
Prije i nakon brisanja “Downtown”
Uklanjanje čvora lista koji sadrži “Downtown” nije rezultiralo time da
njegov roditelj ima premalo pointera, pa su kaskadna brisanja
zaustavljena s brisanjem roditelja čvora lista.
Primjer B+- stabla - brisanje
Brisanje “Perryridge” iz rezultata prethodnog primjera
Čvor sa “Perryridge” postaje nedovoljno pun (u ovom slučaju prazan) i miješa se sa
svojim djetetom.
Rezultat je da “Perryridge” čvor roditelj postaje nedovoljno pun i miješa se s djetetom
(a ulaz se briše iz njegovih roditelja)
Korijenski čvor sada ima samo jedno dijete, i obrisan je a njegovo dijete postaje novi
korijenski čvor
Primjer B+- stablo - brisanje
Prije i nakon brisanja “Perryridge” iz ranijeg primjera
Roditelj lista koji sadrži Perryridge postaje nedovoljno pun i posuđuje
pointer od svog lijevog djeteta
Vrijednost ključa pretraživanja u roditeljevom roditelju se mijenja
B+- stablo organizacija datoteke
Problem degradacije indeksne datoteke rješava se
uporabom B+-stablo indeksa. Problem degradacije
datoteke rješava se uporabom B+-stablo organizacije
datoteke.
Čvorovi listova u B+-stablo organizaciji datoteke pohranjuju
slogove umjesto pokazivača.
Pošto su slogovi dulji od pointera, maksimalni broj slogova
koji može biti smješten u čvoru lista je manji od broja
pointera u čvoru bez lista.
Čvorovi listova i dalje moraju biti napula popunjeni.
Dodavanje i brisanje se izvršava na isti način kao
dodavanje i brisanje ulaza kod B+- stablo indeksa.
B+-stablo organizacije datoteke
Primjer B+-stablo organizacije datoteke
Dobro korištenje prostora je bitno jer slogovi koriste više prostora od pointera.
Za poboljšanje korisštenja prostora može se uključiti više čvorova djece u
redistribuciju tijekom razdvajanja i miješanja
Uključivanje 2 djeteta u redistribuciju (za izbjegavanje razdvajanja /
miješanja gdje je to moguće) rezultat u svakom čvoru ima najmanje
2n / 3
ulaza
B-Stablo indeksne datoteke
Slično B+-stablu, ali B-stablo dozvoljava da se vrijednost ključa
pretraživanja pojavi samo jedanput
Eliminira redudantno pohranjivanje ključeva pretraživanja
Ključevi pretraživanja u čvorovima bez listova ne pojavljuju se nigdje
drugo i B-stablu, što znači da se mora dodati dodatno polje pokazivača
za svaki ključ pretraživanja i čvoru bez listova.
Općeniti prikaz B-stablo list čvora
Čvor bez listova – pointeri Bi su pointeri pretinca ili sloga
datoteke.
B-Stablo indeksne datoteke – Primjer
B-stablo (iznad) i B+-stablo (ispod) za iste podatke
B-Stablo indeksne datoteke
PREDNOSTI B-Stabla:
Može koristiti manje čvorova stabla od odgovarajućeg B+-stabla.
Ponekad je moguće pronaći vrijednost ključa pretraživanja prije nego
se dođe do čvora lista.
NEDOSTACI B-Stabla:
Samo se mali dio svih vrijednosti ključa pretraživanja pronađe ranije
Čvorovi bez listova su veći tako da je “krošnja” smanjena. B-Stabla
obično imaju veću dubinu od odgovarajućih B+-Stabala
Dodavanje i brisanje je znatno kompliciranije nego kod B+-stabala
Implementacija je teža nego za B+- stabla.
Obično prednosti B-stabala ne prevažu nad nedostacima.
Rasuti (Hash
(Hash)) indeksi
Hashing se može koristiti ne smao za organizaciju datoteke, već
i za kreiranje indeksne strukture.
Rasuti (hash) indeks organizira ključeve pretraživanja zajedno
s njihovim pointerima na slogove u rasutu (hash) datotečnu
strukturu..
Striktno gledajući, rasuti indeksi su uvijek sekundarni indeksi
Ako je i sama datoteka organizirana korištenjem hashinga, odvojeni
primarni hash indeks nad njom koji bi koristo isti ključ pretraživanja
je nepotreban.
Pojam rasuti indeks odnosi se i na sekundarne indeksne strukture i
hash organizirane datoteke.
Primjer Hash indeksa
Nedostaci statičkog hashing
hashing
Kod statičkog hashinga funkcija h mapira vrijednosti ključeva
pretraživanja u fiksni skup adresa pretinaca.
Baze podataka rastu s vremenom. Ako je početni broj pretinaca
premali, performance će degradirati zbog prevelikog prelijevanja
(overflow).
Ako je veličina datoteku u nekom budućem vremenu anticipirana i
broj pretinaca dodijeljen sukladno tome, značajna količina prostora
će se inicijalno uzalud gubiti.
Iako se baza smanjuje, prostor če biti potrošen.
Jedna od mogućnosti je periodično reorganiziranje datoteke
pomoću nove hash funkcije, ali je to vrlo skupo.
Ovi problemi se mogu izbjeći korištenjem tehnika koje
dozvoljavaju dinamičku izmjenu broja pretinaca.
Dinamički hashing
hashing
Dobar za baze podatka koje mijenjaju veličinu (rastu/smanjuj se)
Dozvoljava dinamičku promjenu hash funkcije
Proširivi – obilik dinamičkog hashinga
Hash funkcija generira vrijednosti na većem opsegu — obično b-bit
integeri, s b = 32.
U bilo kojem trenutki koristi se samo prefiks hash funkcije za
indeksiranje tablice adresa pretinaca.
Neka je duljina prefiksa i bitova, 0 ≤ i ≤ 32.
Tablica adresa preinaca je veličine = 2i. Inicijalno i = 0
Vrijednost za i raste i smanjuje se kako se veličina baze povećava i
smanjuje.
Višestruki ulazi u tablicu adresa pretinaca mogu pokazivati na
pretinac.
Slijedi, stvarni broj pretinaca je < 2i
Broj pretinaca se također mijenja dinamički zbog razdvajanja
pretinaca.
Opća proširiva hash
hash struktura
U ovoj strukturi, i2 = i3 = i, dok je i1 = i – 1
Uporaba proširive hash
hash struk
trukture
Svaki pretinac j pohranjuje vrijednost ij; svi ulazi koji pokazuju na
isti pretinac imaju iste vrijednosti za prvih ij bitova.
Za lociranje pretinca koji sadrži ključ pretraživanja Kj:
1. Izračunati h(Kj) = X
2. Koristiti prvih i uređenih bitova od X kao zamjenu u tablici adresa
pretinaca i slijediti pkazivač do odgovarajućeg pretinca
PITANJA za KRAJ ?