You are on page 1of 14

Indeksi

U večini baza podataka za brži pristup podacima koriste se indeksi. Zbog čega su bitni
indeksi najbolje je ilustrovati na primjeru.

Slogovi u bazi podataka smiještaju se u stranice (blokove). Veličina bloka se obično


kreće od 2KB do 8KB. U MSSQL Serveru 2005 veličina stranice je 8KB (1024 * 8 =
8192B). Zaglavlje svake stranice je 96 B što znači da jedna stranica ima 8098B korisnog
prostora. U taj prostor se smještaju slogovi (ako su stranice za podatke), veliki objekti
(clob, blob, varchar(max), nvarchar(max)..., indeksi i ostali podaci.
Pretpostavimo da je u bazi definisana tabela

Studenata(index int, jmbg bigint, ime nvarchar(50), prezime nvarchar(50), imeRoditelja


nvarchar(50), mjestoRodjenja nvarchar(50), grad nvarchar(50), adresa nvarchar(50),
datum smallDatetime, fakultet int, telefon varchar(15), odsjek int, godina smallint)

Kolika je dužina sloga?

Red.broj Kolona Tip Min Max Prosječna dužina


dužina dužina
1 Index Int 4 4 4
2 Jmbg Bigint 8 8 8
3 Ime Nvarchar(50) 4 104 16 (6 slova)
4 Prezime Nvarchar(50) 4 104 20 (8 slova)
5 imeRoditelja Nvarchar(50) 4 104 16 (6 slova)
6 mjestoRodjenja Nvarchar(50) 4 104 20 (8 slova)
7 Grad Nvarchar(50) 4 104 20 (8 slova)
8 Adresa Nvarchar(50) 4 104 36 (16 slova)
9 Datum smallDateTime 4 4 4
10 Fakultet Int 4 4 4
11 Odsjek Int 4 4 4
12 Telefon Varchar(15) 4 19 13
13 Godina Smallint 2 2 2
Ukupno 54 669 167

Znači u jednu stranicu može stati:

Broj slogova sa 100% punjenjem blokova


Prosječne dužine 8096 / 167 = 48
Minimalne dužine 8096 / 54 = 149
Maksimalne dužine 8096 / 669 = 12

Broj slogova sa 80% punjenjem blokova


Prosječne dužine (0,8 * 8096 / 167) = 39
Minimalne dužine (0,8 * 8096 / 54) = 119
Maksimalne dužine (0,8 * 8096 / 669) = 9
U slučaju da koristimo 80% inicijalnu popunjenost stranica onda u jednu stranicu može
stati 8096 * 0.8 / 167 = 39 slogova. Na Sarajevskom univerzitetu studira oko 40.000
studenata to znači da za pamćenje svih studenata treba 40000 / 39 = 1026 stranica. Ako
trazimo studenta po šifri tada će u prosjeku trbati pročitati ½ stranica znači 513 stranica.
Koliko nam vremena treba za čitanje?

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:

Pomjeranje glave 2ms


Pozicioniranje glave na početak bloka 2ms
Čitanje bloka 4ms
Ukupno 8ms

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.

Za brži pristup podacima grade se indeksi. Najčešća realizacija indeksa je sa korištenjem


B drvetom.
Drvo kao dinamička struktura

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 je skup čvorova i veza takvih da je


(1) T je prazan skup ili
(2) samo jedan čvor nazvan korijen nema predhodnika. Sljedbenici korijena (ako postoje) su
neprazna disjunktna drveča nazvana poddrveča od T ili podrveča korijena. Svaki čvor je korijen
od T ili je član poddrveča.

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))}

Dubina je osobina cijelog drveta.

B drvo
B drvo reda n je struktura sa slijedećim karakteristikama:

1. Svaki čvor u B-drvetu ima najviše 2*n slogova (ključeva).


2. Svaki čvor (osim korijena) ima najmanje n slogova (ključeva).
3. Svaki čvor je ili list (nema sljedbenika) ili ima m+1 sljedbenika gdje je m broj slogova
(ključeva).
4. Svi terminalni čvorovi su na istom nivou.

Primjer B-drveta reda 2 sa 3 nivoa

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:

Podaci u čvoru B-drveta su uredjeni i za njih važe sljedeća pravila:

1. Ključevi u jednoj stranici su sortirani t.j.


ključ k1 < ključa k2 <...< ključa km
2. Ključ ki-1 < ključa ki < ključa ki+1
3. Skup ključeva u podstablu p0 < ključa k1
4. Ključ ki < skupa ključeva u podstablu pi < ključa ki+1
5. Ključ Km < skupa ključeva u podstablu pm

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:

Pretpostavimo da je ovako izgledalo stablo prije ubacivanja podatka 22. Podatak 22 po


vrijednosti treba da se ubaci u desno podstablo ovog drveta. Kako ovaj podatak ne može stati u
ovaj čvor dolazi do cijepanja strane u formiranja novog čvora. Skup podataka sa manjim
vrijednostima t.j. 22 i 26 se upisuju u jednu stranicu, skup podataka sa večim vrijednostima t.j. 35
i 40 se pišu u drugu stranicu a srednji podatak t.j. 30 se piše u stranicu otac (u ovom služaju
korijen) drveta.

Novonastalo drvo će izgledati ovako:


Ovakav način ubacivanja podataka štiti sve navedene karakteristike B drveta. Novonastale
stranice sadrže tačno n podataka. Dijeljenjem stranice i ubacivanje podataka u stranicu otac može
se desiti da dodje do dijeljenja i te stranice po istom principu kako se podijelila stranica list. Ovo
dijeljenje može se propagirati sve do korijena. U momentu podjele korijena formira se novi
korijen tako da se dubina drveta u tom momentu povečava. B drvo ima strogo pravilo rasta i to od
listova prema korijenu. Razmotrimo nastajanje b drveta za sljedeći niz podataka:

20; 40, 10, 30, 15; 35, 7, 26, 18, 22; 5; 42, 13, 46, 27, 8, 32; 38, 24, 45, 25;;

; označava dijeljenje stranice

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.

Primjer: iz gore formiranog stabla treba izbrisati elemente sljedećim redom:

25, 45, 24; 38, 32; 8, 27, 46, 13, 42; 5, 22, 18, 26; 7, 35, 15;

; označava momenat spajanja stranica.

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).

2. Proracun veličine – dubine b drveta. Veličina B drveta ovisi o:

a. broju slogova (N) ,


b. veličini slogova (R),
c. veličine pokazivača (P),
d. veličini stranice (B),
e. popunjenosti stranica (drveta) (D)

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.

• broju slogova (N = 40.000)


• veličine pokazivača (P = 4 B),
• veličina ključa (indeks) (K = 4 B)
• veličini slogova (R – slog je indeksni element E = K + p = 4 + 4 = 8),
• veličini stranice (B = 8000 B),
• popunjenosti stranica (drveta) (D = 80%)

Slobodni dio stranice je:

Veličina bloka(B) – Zaglavlje bloka(Z = 96) = (8192B - 96 B) = 8098B

Broj indeksnih elemenata u stranici:

• U slobodni dio stranice upisuje se n+1 pokazivač i n slogova (indeksnih elemenata)

n = (B-P) / (E+P) = (8096 – 4) / (8 + 4) = 8092 / 12 = 674

tj u jednu stranicu može stati 674 indeksna elementa (ključ i pokazivač na slog) i 675
pokazivača na podstabla.

Na I nivo može imati do 674 slogova (indeksnih elemenata)


Na II nivou možemo imati maksimalno 675 stranica tj 675 * 674 = 454.950 slogova.
Kako je popunjenost sranica na II nivou iznad 50% to uz popunjenost od 50% 227.475
slogova.
Vrijeme čitanja (pronalaženje sloga sa podacima koristeći indeks) u svim ovim
slučajevima je:
• Čitanje korijena 8 ms
• Čitanje čvora na II nivou 8 ms
• Čitanje podataka 8 ms

Znači ukupno je potrebno maksimalno 24 ms ili 0.024 s za pronalak sloga pomoću


indeka.

U slučaju da pravimo indeks po prezimeu i imenu tada će veličina drveta biti:

• broju slogova (N = 40.000)


• veličine pokazivača (P = 4 B),
• veličina ključa (indeks) (K = 36 B)
• veličini slogova (R – slog je indeksni element E = K + p = 36 + 4 = 40),
• veličini stranice (B = 8000 B),
• popunjenosti stranica (drveta) (D = 80%)

Slobodni dio stranice je:

Veličina bloka(B) – Zaglavlje bloka(Z = 96) = (8192B - 96 B) = 8098B

Broj indeksnih elemenata u stranici:

• U slobodni dio stranice upisuje se n+1 pokazivač i n slogova (indeksnih elemenata)

n = (B-P) / (E+P) = (8096 – 4) / (36 + 4) = 8092 / 40 = 202

tj u jednu stranicu može stati 202 indeksna elementa (ključ i pokazivač na slog) i 203
pokazivača na podstabla.

Na I nivo može imati do 202 slogova (indeksnih elemenata)


Na II nivou možemo imati maksimalno 203 stranica tj 203 * 202 = 41.006 slogova. Kako
je popunjenost sranica na II nivou iznad 50% to uz popunjenost od 50% 20.503 slogova.
Na III nivou možemo imati maksimalno 203 * 203 = 41.209 stranica tj 41.209 * 202 =
834.058 slogova. To znači da ako je stablo popunjeno ukupan broj indeksnih elemenata
je 834.058 + 41.006 + 202 = 875.266
Na IV nivou možemo imati maksimalno 203 * 203 * 203 = 8.365.427 stranica tj
8.365.427 * 202 = 1.689.816.254 slogova.

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

Što je ukupno 32ms ili 0,032s.

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 osobine B drveta su:

 gubitak prostora za pokazivače u listovima B-drveta (litova je više od 50%)


 prilikom sekvencijalne obrade slogova smještenih u B-drvetu višestruko čitanje pojedinih
stranica (čvorova) u slučaju kada je B-drvo zapamčeno na eksternom mediju

Bolje osobine B* drveta

 Slogovi su smješteni samo u listove. Nema gubitka memorije za pokazivače. Brže


sekvencijalno pretraživanje jer se ne učitava indeksna struktura (stranice na višem nivou) za
sekvencijalno čitanje
 U indeksnu strukturu se smještaju samo ključevi i to jedan ključ za slogove iz jedne stranice
 Budući da je odnos ključ/stranica obično povoljniji nego slog/stranica to je dubina B* drveta
manja od dubine B drveta

Negativne karakteristike

 Podaci iz ključeva se dupliraju tako da se troši nešto više memorije

Proračun dubine i broja stranica B* drveta

Dubine drveta direktno zavisi od:

 broja slogova (N)


 veličine sloga (R)
 veličine ključa (K)
 veličine pokazivača (P)
a dubina drveta obrnuto proporcionalno zavisi od

 veličine stranice (B)

Za proračun parametara B* drveta prvo se računa broj slogova u stranici

Br = trunc(B/R)

Broj stranica listova (stranica sa podacima) je

Nbr = roundup(N/Br)

Broj ključeva u indeksnoj strukturi je jednak broju listova

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

Ne = trunc(B / E) (broj ključeva u indeksnoj stranici)

Broj indeksnih stranica na nivou neposredno iznad listova je

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

Br = B/R = 1000/100 = 10 slogova u stranici

Nr = N/Br = 1000000 / 10 = 100000 stranica sa podacima odnosno indeksnih elemenata

Ne = B / E = 1000 / 14 = 71.42 = 71 ključ u stranici

Nbea = Nr / Ne = 100000 / 71 = 1408.45 = 1401 indeksna stranica na nivou 1 iznad podataka

Nbeb = Nbea / Ne = 1401 / 71 = 19.73 = 20 indeksnih stranica na 2 nivou iznad podataka


Nbec = Nbeb / Ne = 20 / 71 = 0.28 = 1 indeksnih elemenata na trecem nivou iznad podataka

Rekapitulacija:

I nivo 1 stranica
II nivo 20 stranica
III nivo 1401 stranica
Indeksna struktura 1422 stranice
Podaci 100000 stranica
Ukupno stranica 101422 stranice

Procentualno 1422*100/ 101422 = 1.4 %

Radi poredjenja sličan proračun za B drvo

1000 / (100 + 4 ) = 1000 / 104 = 9,6 = 9 slogova u stranici i 10 pokazivača

I nivo 1 stranica 9 slog


II nivo 10 stranice 90 slogova
III nivo 100 stranica 900 slogova
iV nivo 1000 stranica 9000 slogova
V nivo 10000 stranica 90000 slogova
VI nivo 100000 stranica 900000 slogova
Ukupno 111111 stranica 999999 slogova

Iz ovoga se vidi da je za pamćenje 1000000 slogova sa B* drvetom potrebno 101422 stranice i da


su one postavljenje u 4 nivoa a kod B drveta broj stranica je 111111 postavljenih u 6 nivoa.
Medjutim postoje slučajevi kada je ovaj odnos u korist B drveta. Ako je odnos slog/ključ mali to
jest ako je ključ velik i predstavlja veliki dio sloga ili je jednak slogu što je u praksi moguče tada
je organizacija pomoću B drveta, sa stanovišta prostora i slučajnog pristupa povoljnija ali i dalje
ostaje sekvencijalni pristup kod b* drveta povoljniji.

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.

Ostale vrste indeksa

• Bitmap indexes, koji pamti rowids pridružen sa vrijednosti ključa kao


bitmapa

Slijedeća naredba kreira bitmap indeks na vrijednostima funkcije typeid


kolone author nad tabelom books:
CREATE BITMAP INDEX typeid_i ON books
(SYS_TYPEID(author));
SELECT name, SYS_TYPEID(VALUE(p)) "Type_id" FROM persons p;

NAME Type_id
------------------------- --------------------------------
Bob 01
Joe 02
Tim 03

Slijedi kreiranje bitmap index nad tabelom oe.hash_products:


CREATE BITMAP INDEX product_bm_ix
ON hash_products(list_price)
TABLESPACE tbs_1
LOCAL(PARTITION ix_p1 TABLESPACE tbs_02,
PARTITION ix_p2,
PARTITION ix_p3 TABLESPACE tbs_03,
PARTITION ix_p4,
PARTITION ix_p5 TABLESPACE tbs_04 );

• Partitioned indexes, koji se sastoji od particije koja sadrži ulaz za svaku


vrijednost koja se pojavljuje u indeks koloni tabele

Slijedeća naredba kreira globalni index cost_ix na tabeli sh.sales sa


tri particije koje su podijeljene u tri grupe na osnovu cijene:
CREATE INDEX cost_ix ON sales (amount_sold)
GLOBAL PARTITION BY RANGE (amount_sold)
(PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (2500),
PARTITION p3 VALUES LESS THAN (MAXVALUE));

Slijedeća naredba kreira hash-particionisani globalni indeks


cust_last_name_ix nad tabelom sh.customers sa četiri particije:
CREATE INDEX cust_last_name_ix ON customers
(cust_last_name)
GLOBAL PARTITION BY HASH (cust_last_name)
PARTITIONS 4;

• Function-based indexes, koji je zasnovan na izrazu. On omogućava


konstrukciju upita koji izračunavaju vrijednosti koji se vračaju kao rezultati
funkcija.
o CREATE INDEX upper_ix ON employees (UPPER(last_name));

o CREATE INDEX income_ix


ON employees(salary + (salary*commission_pct));

SELECT first_name||' '||last_name "Name"


FROM employees
WHERE (salary*commission_pct) + salary > 15000;

o CREATE INDEX src_idx ON


print_media(text_length(ad_sourcetext));

o CREATE TYPE rectangle AS OBJECT (length


NUMBER, width NUMBER, MEMBER FUNCTION area
RETURN NUMBER DETERMINISTIC);

CREATE OR REPLACE TYPE BODY rectangle AS


MEMBER FUNCTION area RETURN NUMBER IS
BEGIN
RETURN (length*width);
END;
END;

• Domain indexes, specifični indeksi u aplikacijama – indeksi tipa


indextype
Kreiranje indeksa nad XML tipovima podataka:

Slijedeći primjer kreira indeks nad elementom xwarehouses table:


CREATE INDEX area_index ON xwarehouses e
(EXTRACTVALUE(VALUE(e),'/Warehouse/Area'));

Klaster indeks – indeks koji nastoji poredati (zapisati) slogove u redoslijedu ključa
indeksa.

CREATE INDEX idx_personnel ON CLUSTER personnel;

Kada se nije poželjno kreirati indeks

• Ako je tabela mala


• Kolone se ne koriste često kao uslov u upitima
• Najveći broj upita vraća više od 2 do 4 % redova
• Tabela (polja indeksa) se ažurira često

Kada se treba kreirati indeka

 Kolone sadrže širok rang vrijednosti


 Kolone sadrže velik broj null vrijednosti
 Jedna ili više kolona se često koriste u WHERE klauzuli ili join uslovu
 tabela je velika i očekuje se da većina upita pretražuje manje od 2 do 4 % redova

You might also like