Professional Documents
Culture Documents
41 Indeksi
41 Indeksi
U večini baza podataka za brži pristup podacima koriste se indeksi. Zbog čega su bitni
indeksi najbolje je ilustrovati na primjeru.
Neka je tabela smještena na vrlo brzi disk koji ima 15000 obrtaja u minuti i neka je tabela
lijepo složena (stranice su popunjene, nema stranica prekoračenja...). Naš vrlo brzi disk
će praviti 15.000 obrtaja u minuti što znači 15000 / 60 = 250 obrtaja u sekundi ili 1
obrtaj za 4ms. Ako je glava diska na pola staze znači da će za početak čitanja bloka
trebati 2 ms (da se glava diska pozicionira na početak (nekada 0 a nekada 4 ms)) i da će
mu za čitanje trebati 4 ms (jedna staze). Znači ako je glava diska iznad staze prosječna
brzina čitanja jedne stranice je 6 ms. Pomjeranje glave sa staze na stazu je 2 ms. To znači
da za čitanje jednog bloka treba:
Znači za čitanje cijele tabele treba 513 * 8ms = 4104ms = 4.104s. Ako nam je za
nalaženje 1 sloga nekada potrebno učitati samo jednu stranicu a nekada je potrebno
učitati sve stranice to znači da prosječno treba pola ovog vremena za pronalazak studenta
po indeksu odnosno 2.052s. Ako ovu operaciju ponavljamo 1500 puta koliko ima
studenata na ETF-u to će nam trebati 3.078 s (oko 51,3 min) za cijelu operaciju.
Ovdje treba napomenuti da smo obracun uradili sa diskom koji ima 15000 obrtaja u
minuti a večina ih je sa 10000 ili čak sa 5600 ili 4800 obrtaja u minuti znači da će se
vrijeme, gore opisanog pristupa povečati.
Ovdje treba napomenuti da baze podataka imaju bafere i da se učitanje stranice, ako ima
dovoljno prostora, kada se jednom učitaju čuvaju u memoriji, tako da će ovi pristupi biti
znatno brži. U principu prvi prolaz će biti ovak kako je izračunatao dok će ostali pristupi
biti znatno brži jer je večina stranica u memoriji. To znači da će se za čitanje svih podatak
u meoriju potrošiti 1026 stranica po 8ms = 8028ms = 8,028s. Cilj ovog primjera je da se
pokaže, ako se zanemari postojanje bafera, koliko se brže pristupa pomoću indeksa.
Često, više korisnika imaju konekciju nad bazom podataka, oni imaju različite upite i svi
oni učitavaju podatke u pool bafera, koji se u tom slučaju napune, tako da se stranice
izbacuju iz njega i da ih treba ponovno čitati.
Definicija:
U kontekstu drveta čvor je element u kome su smješteni podaci kao i njegov odnos sa njegovim
predhodnikom (ako ga ima) i sljedbenikom (ako ga ima) u drvetu. Veza (link, luk, pokazivač) je
odnos čvora sa njegovim nasljednicima.
Drvo T ili je prazno ili je konačan skup od jednog ili više čvorova takvih da postoji specijalno
dizajniran čvor t E T (koji se zove korijen drveta T) i T - {t} može se podijeliti u nijedno, jedno
ili više rastavljenih (razdvojenih) podskupova T1, T2,...,Tn od kojih je svako za sebe drvo
(poddrvo)
Čvor je komponenta drveta gdje su smešteni podaci. Svaki čvor sadrži podatke i nula, jedan ili
više veza (linkova, pokazivača, grana, lukova) na druge čvorove. Gornja definicija kaže da je
svaki čvor korijen jednog drveta.
Broj veza koji izlaze iz jednog čvora naziva se stepen. Maksimalni stepen svih čvorova
predstavlja stepen drveta.
Postoje razni načini predstavljanja drveća. Predstavljanje jednog te istog drva dato je na sljedećoj
slici:
Broj poddrveča u čvoru naziva se stepen čvora. Čvorovi koji nemaju poddrveče nazivaju se
listovi ili terminalni čvorovi. Svi drugi čvorovi nazivaju se neterminalni čvorovi. U radu sa
drvečem često se koriste termini roditelj ili otac i dijete. Čvor a je roditelj ili otac čvorova b i c.
Čvorovi b i c su djeca čvora a.
Korijen drveta nema roditelja (oca). Svi čvorovi osim korijena imaju samo jednog roditelja. Iz
toga slijedi da postoji samo jedan put od korijena do svakog čvora.
NIVO 1 a
NIVO 2 b c
NIVO 3 d e f
NIVO 4 g
Nivo čvora predstavlja broj čvorova od korijena do čvora. Nivo korijena je 1 pa možemo reči da
je nivo čvora
L(t) = if Korijen(t)
1
else
1 + L(Roditelja)
Dubina drveta je maksimalni nivo u drvetu. Ako je T binarno drvo (stepen drveta) tada je dubina
H(T) = if empty(T)
0
else
1 + max{H(left(T)),H(right(T))}
B drvo
B drvo reda n je struktura sa slijedećim karakteristikama:
Svi čvorovi imaju 2, 3 ili 4 sloga osim korijena koji može imati od 1 do 4 sloga. Svi listovi nalaze
se na trećem nivou. Ključevi podataka pojavljuju se u rastućem redoslijedu od lijeva na desno.
Opći oblik stranice B drveta je:
Algoritam pretraživanja drveta t.j. pronalska podatka sa datom vrijednosti je dosta jednostavan.
Prvo se podatak traži u korijenu. Ako je čvor velik može se koristiti binarno pretraživanje inače
koristi se sekvencijalno pretraživanje. U slučaju da podatak nije nadjen tada se pretraživanje
nastavlja na isti način u podstablima na koje pokazuje odgovarajući pokazivač t.j. ako je traženi
podatak < k1 tada se traži u poddrvetu na koje ukazuje pokazivač p0, ako je podatak veči od Km
tada se pretraživanje nastavlja u poddrvetu na koji pokazuje pokazivač Pm inače pretraživanje se
nastavlja u poddrvetu Pi koji se nalazi izmedju kljuceva ki i Ki+1 izmedju kojih se nalazi tražena
vrijednost. Pretraživanje se zaustavlja ili kada je podatak nadjen ili ako podatak nije nadjen u
odgovarajućem listu.
Ubacivanje podataka u B-drvo je takodje jednostavno. Uvijek se ubacivanje novog podatka vrši u
list. Prvo se pronađe stranica u kojoj bi, da postoji, taj podatak nalazio. U slučaju da je broj
podataka manji od 2*n tada se jednostavno ubacivanje vrši tako da se novi podatak ubaci u list na
mjesto gdje po vrijednosti ključa pripada. U slučaju da je broj podataka jednak 2*n (čvor pun)
tada se vrši djeljenje čvora na dva čvora a srednji podatak se ubacuje u čvor na višem nivou.
Primjer takvog ubacivanja dat je na sljedećoj slici:
20; 40, 10, 30, 15; 35, 7, 26, 18, 22; 5; 42, 13, 46, 27, 8, 32; 38, 24, 45, 25;;
Brisanje podataka iz B drveta je nešto komplikovanije od ubacivanja ali se radi uvijek po istim
principima to jest traži se da osobine B drveta uvijek ostanu sačuvane. Generalno uzevši moguče
je nekoliko slučajeva:
1. Briše se podatak iz lista a pri tome list ostaje popunje preko 50%; podatak se jednostavno
izbrise iz lista i to je najjednostavniji slučaj
2. Briše se podatak iz lista ali u listu ostaje manje od 50% popunjenost; U tom slučaju se
pokušava ta stranica spojiti sa jednom od susjednih stranica. Ako je to moguče spajanje se
vrši ali ako to nije moguče tada se vrši prelijevanje podataka iz jedne od stranica preko
stranice otac.
3. Briše se podatak iz neterminalne stranice; Tada se iz lijevog postabla uzima največi podatak
(zadnji podatak iz krajnjeg desnog lista) ili se iz desnog podstabla uzima najmanji podatak
(prvi podatak iz krajnjeg lijevog podstabla) i prenosi se u tu stranicu. Nakon toga se ispituje
da li je popunjenost stranice lista iz koje je uzet podatak manji od 50% i ako jest vrši se
spajanje ili prelijevanje podataka.
Prilikom spajanje listova uvijek se briše jedan podatak iz stranice otac tako da se spajanje može
propagirati sve do korijena. U slučaju da se briše korijen tada se nivo drveta smanjuje za jedan.
25, 45, 24; 38, 32; 8, 27, 46, 13, 42; 5, 22, 18, 26; 7, 35, 15;
Kako je operacija spajanja rijetka a i dosta skupa (uzima dosta vremena budući da se moraju
ispitati susjedne stranice...) to se nekada namjerno pušta da performance B-drveta padnu ispod
granice t.j. da popunjenost stranice bude i ispod 50%.
Osobine B drveta:
1. Sekvencijalno čitanje slogova u B drvetu radi se tako da se prvo pročitaju svi slogovi redom u
čvoru koji se nalazi skroz lijevo. Nakon toga se čita čvor otac i vrši obrada jednog sloga da bi se
zatim pročitao sljedeći list i t.d. Nakon čitanja i obrade jednog podstabla čita se čvor otac i prelazi
se na čitanje slijedećeg podstabla. Ovakvo čitanje je brzo ako se podaci nalaze u centralnoj
memorijiali je sporo ako se nalazi na eksternoj memoriji buduđi de se nake stranice (čvorovi)
moraju čitati više puta što je dosta skupa operacija (reda više ms).
Veličina drveta je direkno proporcionalna broju slogova, veličini sloga i veličini pokazivača a
obrnuto proporcionalna veličini stranice i popunjenosti drveta. Odnos n = trunc((B - p) / (R + P))
odredjuje stepen drveta i kaže koliko slogova može stati u jedan čvor drveta. U korijen staje od 1
do n slogova. U svaki drugi čvor staje n div 2 do n elemenata. Što znači da na drugi nivo može da
stane maksimalno (n + 1) * n slogova (n + 1 - broj pokazivača u stranici roditelj * n broj slogova
koji mogu stati u stranicu) do minimalnih 2 * (n div 2) slogova. Na slijedeći nivo može da stane
maksimalno (n+1)* (n+1) * n slogova. Iz ovoga se može zaključiti da je broj nivoa približno
jednak log broja slogova za bazu stepena B drveta.
tj u jednu stranicu može stati 674 indeksna elementa (ključ i pokazivač na slog) i 675
pokazivača na podstabla.
tj u jednu stranicu može stati 202 indeksna elementa (ključ i pokazivač na slog) i 203
pokazivača na podstabla.
Vrijeme čitanja (pronalaženje sloga između 40.000 slogova po ključu koji je izuzetno dug
koristeći indeks) u svim ovim slučajevima je:
• Čitanje korijena 8 ms
• Čitanje čvora na II nivou 8 ms
• Čitanje čvora na III nivou 8 ms
• Čitanje podataka 8 ms
B* drvo
Za razliku kod B drveta za realizaciju B* drvetu potrebne su dvije vrste čvorova (stranica). U
jednu vrstu stranice smiještaju se slogovi. Slogovi su smješteni jedan za drugim tako da se postiže
maksimalno iskorištenje prostora. Na taj način sekvencijalno čitanje slogova je maksimalno brzo.
Drugi tip čvorova (stranica) služi za pamćenje indeksne strukture. Naime, iz slogova se izdvaja
(kopira, duplira) ključ po kome su slogovi složeni i oni se sa odgovarajućim pokazivačima
smiješaju u indeksnu strukturu. Ovo izdvajanje (dupliranje) ključeva se radi samo za jedan slog iz
stranice. Obično se uzima maksimalni ključ iz stranice i smješta se po principu B drveta u
indeksnu strukturu. To znači da je u indeksnoj strukturi smješteno onoliko ključeva koliko je
stranica sa slogovima. Indeksna struktura je organizovana po principu B-drveta stom razlikom da
pokazivači u listovima pokazuju na stranice sa slogovima. Kako je ključ obično mnogo manji od
sloga to u indeksnu stranicu može stati mnogo više ključeva nego slogova pa je ta struktura
obično plića od strukture koja sadrži isti broj slogova a realizovana je pomoću B drveta. Ukupan
broj stranica je obično veči kod realizacije strukture sa B* drvetom ali su ostale performance
briza sekvencijalnog, brzina slučajnog pretrazivanja, brzina ubacivanja, brisanja (rjeđe situacije
cijepanja i spajanja stranica jer je odnos ključ stranica povoljniji nego odnos slog stranica) puno
bolje nego kod strukture realizovane sa B drvetom.
Negativne karakteristike
Br = trunc(B/R)
Nbr = roundup(N/Br)
Nk = Nbr
Za proračun indeksne strukture potrebno je stračunati odnos veličine ključa i pokazivača prema
stranici. Ključ i pokazivač zajedno se obično nazivaju indeksni element. Indeksni element (E)
jednak je zbiru dužine ključa i pokazivača.
E=K+P
Nbki = roundup(Nk/Ne)
Ovaj broj stranica predstavlja ujedno i broj indeksnih elemenata na sljedećem gornjem nivou.
Proces računanja se nastavlja na isti način a zaustavlja se kada se dobije da je broj indeksnih
stranica jednak 1.
Primjer:
N= 1000000 slogova
B = 1000 B
R = 100 B
K = 10 B
P=4B
E = K + P = 10 + 4 = 14 B
Rekapitulacija:
I nivo 1 stranica
II nivo 20 stranica
III nivo 1401 stranica
Indeksna struktura 1422 stranice
Podaci 100000 stranica
Ukupno stranica 101422 stranice
Kako se u gornjim nivoima indeksne strukture ključevi obično razlikuju več nakon prvog ili
drugog karaktera to je moguče u gornjim nivoima veličinu ključa skratiti samo na prvih nekoliko
karaktera tako da odnos ključ stranica bude još povoljnija tako da dubina drveta bude još manja.
NAME Type_id
------------------------- --------------------------------
Bob 01
Joe 02
Tim 03
Klaster indeks – indeks koji nastoji poredati (zapisati) slogove u redoslijedu ključa
indeksa.