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 logn/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 ?
© Copyright 2025 Paperzz