Indeksi Korieni slajdovi autora Hector GarciaMolina Vera Goebel
Indeksi Korišćeni slajdovi autora Hector Garcia-Molina, Vera Goebel i sa IBM kurseva
Overview Literatura: Database Systems: The Complete Book 2 nd ed. Pearson, 2009. autori: Hector Garcia-Molina, Jeffrey Ullman, Jennifer Widom poglavlja 14. 1 i 14. 2 (str. 619 -647) 2/49
Pretraživanje podataka Kako relativo brzo locirati tražene podatke? Linearno pretraživanje - primer 1: SELECT * FROM tabela WHERE a = 40 čita se jedan po jedan slog u proseku se čita 50% slogova, odnosno 50% blokova na disku velika potrošnja resursa a b c 50 10 30 40 20 60 3/49
Search - II Linearno pretraživanje - primer 2: SELECT * FROM R, S WHERE a = d za svaku torku iz R čita se u proseku 50% torki iz S - neefikasno a b c d 40 10 10 20 60 30 e f 40 50 60 Potreban je mehanizam za ubrzanje pretraživanja torke sa konkretnom vrednošću atributa →Indeksi 4/49
Konvencionalni indeksi
Indeksi Indeks nad atributom A je struktura podataka koja omogućuje jednostavno pronalaženje svih elemenata koji imaju fiksiranu vrednost atributa A Svaki indeks se formira nad atributima ključ pretrage (indeksirani atribut/skup atributa) indeks čuva uređenu vrednost ključa pretrage zajedno sa listom pokazivača na odgovarajući slog da bi se pronašla potrebna adresa pretražuje se indeks a ne originalna datoteka I dalje se za nalaženje potrebnog ključa čita više polja u indeksu, ali je efikasnost povećana jer: veličina polja u indeksu je obično znatno manja od veličine sloga ključevi su sortirani što omogućuje binarno pretraživanje 6/49
Indeksi su posebno korisni nad atributima koji se koriste u WHERE klauzuli ili spajanju Povećavaju memorijske zahteve i složenost modifikacija tabela jer kod promene sadržaja tabele moraju da se ažuriraju i indeksi 7/49
Tipovi indeksa Različiti kriterijumi podele §Upotreba pokazivača • gusti • retki §Prema skupu atributa nad kojima se formira indeks • Primarni (nad atributima koji su primarni ključ, forsira jedinstvenost) • Sekundarni (može ali ne mora da forsira jedinstvenost) • klasterovani (tabela se organizuje u redosledu koji odgovara vrednostima atributa indeksa) blok indeksi za multimenziono klasterovanje 8/49
Gusti indeksi Gusti indeks ima po jedan upis za svaku vrednost ključa a 10 20 30 40 50 60 b c . . . 10 20 30 . . 40 50 60 . . z 9/49
Retki indeksi Redak indeks ima jedan upis za svaki blok podataka a 10 40 70 b c . . . 10 20 30 . . 40 50 60 . . z Za nalaženje traženog sloga sa ključem K pretraži indeks za najveći ključ manji ili jednak K pročitaj blok na koji pokazuje nađeno polje u indeksu pretraži blok za nalaženje sloga 10/49
Retki indeksi Primer: SELECT * FROM R WHERE a = 60 a 10 40 70 100 b c . . . 10 20 30 . . 40 50 60 . . z 11/49
Indeksi na više nivoa Sam indeks može da se, u slučaju velikih podataka, proširi na više memorijskih blokova Efikasnost može da se poveća upotrebom indeksa na više nivoa retki indeks 2. nivo 10 70 130 200 300 400 gusti indeks 1. nivo a b c . . . 10 20 30 40 50 60 10 20 30 . . 40 50 60 . . 70 80 90 100 110 120 70 80 90 . . 100 110 120 . . z 12/49
Indeksi na više nivoa Da li može da se formira gust indeks na drugom nivou? Može, ali nema smisla a 10 20 30 40 50 60 Da li ima smisla koristit redak indeks na nesortiranium podacima? Ne, ali može se koristiti redak indeks nad gustim indeksom nad nesortiranim podacima c . . . 10 20 30 . . 40 50 60 . . a 10 40 70 b b c . . . 10 50 80 . . 40 20 90 . . z z 13/49
Modifikacije indeksa Indeksna datoteka je sekvencijalna datoteka koja mora da se tretira na sličan način kao i datoteka sa sortiranim slogovima: korišćenje pomoćnog bloka (bloka prekoračenja) kod prepunjenosti tekućeg bloka unos novih blokova prebacivanje elemenata u odgovarajući blok Gust indeks pokazuje na pojedinačni slog i shodno tome: modifikuje se ako je slog unet, izbrisan ili pomeren ne vrši se nikakva akcija u slučaju operacija nad blokovima Redak indeks pokazuje na blok i shodno tome: može da se modifikuje ako je slog unet, izbrisan ili pomeren nema akcije u slučaju uključivanja bloka prekoračenja pokazivač mora da se unese (izbriše) ako se unosi (briše) sekvencijalni blok 14/49
Modifikacije indeksa: primer brisanja 1 Primer – brisanje uz upotrebu retkog indeksa: brisanje sloga sa a = 60 a b indeks pokazuje na “pravi” blok brisanje sloga sa a = 40 Primedba: pošto se ažurira prvi slog u bloku, indeks takođe mora da se ažurura 10 40 50 70 100 130 160 c . . . 10 20 30 . . 40 50 50 60 . . 70 80 90 . . 100 110 120 . . z 15/49
Modifikacije indeksa: primer brisanja 2 Primer – brisanje upotrebom gustog indeksa: brisanje sloga sa a = 60 a 10 20 30 40 50 50 60 brisanje sloga sa a = 40 Primedba 1: u velikom broju slučajeva često se radi “kompresija” podataka u bloku Primedba 2: može se komprimovati cela datoteka, ali se obično ostavlja slobodan prostor za narednu obradu podataka brisanje sloga sa a = 50 Primedba 3: prazan blok podataka može da se oslobodi ili se čuva da bi se obezbedilo brže unošenje novih slogova ? 70 80 90 100 110 120 b c . . . 10 20 30 . . 40 50 50 60 . . 70 80 90 . . 100 110 120 . . z 16/49
Modifikacije indeksa: primer unosa 1 Primer – unos sloga uz upotrebu retkog indeksa: uneti slog sa a = 60 Primedba 1: postoji prazan prostor za unošenje – nema promena na indeksu uneti slog sa a = 25 Primedba 2: slog sa a = 25 treba da ide u prvi blok, i pomera slog sa a=30 u drugi blok gde postoji prazno mesto Primedba 3: ima promena u prvom slogu bloka 2, tako da mora da se ažurira i indeks Primedba 4: umesto pomeranja sloga sa a=30 zbog prepunjenosti bloka 3 unosi se novi blok a 10 40 30 70 100 130 160 b c . . . 10 20 30 25 . . 40 30 40 60 60 . . . 70 80 90 . . 100 110 120 . . z 17/49
Modifikacije indeksa: primer unosa 2 Primer – unos slogova uz upotrebu retkog indeksa: uneti slog sa a = 95 a b c. . . nema slobodnog prostora – unosi se blok prekoračenja ili novi sekvencijalni blok prekoračenja ne zahteva se nikakva akcija u indeksu, redak indeks ima pokazivače samo na primarne blokove 10 40 70 100 95 100 novi sekvencijalni (primarni) blok indeks mora da se ažurira Gusti indeksi slično obrađuju unose ali moraju svaki put da se ažuriraju 10 20 30 . . 40 50 60 . . . 70 80 90 . . 100 110 120 . . 95 . . . z 18/49
Gusti i retki indeksi - karakteristike Gusti Retki jedno polje po slogu jedno polje po bloku pristupi bloku veliki broj mali broj pristup slogu direktan pristup pretraživanje unutar bloka koristi samo indeks uvek mora da pristupi bloku bilo gde (nisu gusti/gusti) ne u elementima koji nisu u redosledu uvek se ažuriraju ako se menja redosled slogova ažuriraju se jedino kada se menja prvi slog u bloku prostor upiti sa “exists” upotreba modifikacija 19/49
Pretraživanje po dupliranim vrednostima Indeksi nad ne-ključnim atributima mogu da sadrže duplirane vrednosti. Ako su slogovi soritrani po tim vrednostima u pitanju je klasterovani indeks Prethodno prikazane ideje/rešenja mogu da se primene Više načina implementacije indeksa koji mogu da se jave: gusti indeks nad jednim indeksnim poljem po slogu (pokazivač na sve duplikate) jedinstveni ključ za pretragu (pokazivač samo na prvi slog) redak indeks 20/49
Pretraživanje po dupliranim vrednostima Primer 1 – gusti indeks: jedno indeksno polje po slogu lako se pronalazi slog i koliko ima takvih slogova više polja nego što je potrebno – indeks može da se proširi na više blokova 10 10 20 30 30 40 40 a b c . . . 10 10 10 . . 10 20 30 . . 30 40 40 . . z 21/49
Pretraživanje po dupliranim vrednostima Primer 2 – gusti indeks: samo jedno indeksno polje po jedinstvenom ključu koji se traži manji indeks – brže pretraživanje složenije pronalaženje uzastopnih slogova 10 20 30 40 a b c . . . 10 10 10 . . 10 20 30 . . 30 40 40 . . z 22/49
Pretraživanje po dupliranim vrednostima Primer 3 – redak indeks: indeksno polje je prvi slog u svakom bloku, pokazivač na blok manji indeks – brže pretraživanje komplikovano pronalaženje sloga. Na primer, potrebna je opreznost ako se traži slog sa ključem 30 10 10 30 a b c . . . 10 10 10 . . 10 20 30 . . 30 40 40 . . z 23/49
Pretraživanje po dupliranim vrednostima Primer 4 – redak indeks: indeksno polje je prvi nov slog u svakom bloku, pokazivač na blok mali indeks – brza pretraga komplikovano pronalaženje slogova npr. da li može da se ukloni drugi upis u indeks sa vrednošću 30? 10 30 30 40 a b c . . . 10 10 10 . . 10 30 30 . . 30 30 30 . . 40 40 40 . . z 24/49
Sekundarni indeksi Primarni i klasterovani indeksi rade sa podacima kod kojih su ključevi sortirani Sekundarni indeksi rade sa nesortiranim vrednostima ključeva, odnosno ne određuju mesto sloga u datoteci kao i ostale vrste indeksa koriste se za brzo nalaženje sloga prvi nivo je uvek gust, dok su svi ostali viši nivoi uvek retki dozvoljeni su duplikati vrednosti ključeva sam indeks je sortiran po vrednostima ključa što pojednostavljuje pretraživanje 25/49
Sekundarni indeksi Primer: dozvoljeni su duplikati prvi nivo je gust viši nivoi su retki 10 indeks je sortiran 30 10 10 20 20 30 30 30 a b c . . . 30 10 20 . . 10 30 30 . . 30 20 30 . . z 26/49
Sekundarni indeksi Duplirane vrednosti po kojima se pretražuje mogu da povećaju vreme i prostor koji su potrebni za pretragu Različite veličine polja u indeksu smanjuju potreban prostor za indeks usložnjavaju dizajn i pretraživanje Povezani slogovi sa istom vrednošću ključa jednostavan indeks, lako pretraživanje dodaju se polja sa pokazivačem za praćenje veza za uzastopne vrednosti 10 10 20 20 30 30 30 a b c . . . 30 10 20 . . 10 30 30 . . 30 20 30 . . z x x x 27/49
Sekundarni indeksi Korpe (buckets) su uobičajen način da se izbegne ponavljanje vrednosti a formira se korpa datoteka vrednost indeksa za K pokazuje na prvi element u korpi za K korpa datoteka se obrađuje kao i ostale sortirane datoteke 10 20 30 korpa b c . . . 30 10 20 . . 10 30 30 . . 30 20 30 . . z 28/49
B-drveta
B-drveta U komercijalnim RSUBP se ne koriste konvencionalni indeksi Često se koristi opšta struktura B-drveta automatski se održava odgovarajući broj nivoa održava se prostor u blokovima (obično između polovine i punog bloka), tj. nisu potrebni blokovi prekoračenja drvo je balansirano – svi listovi su na istom nivou Animacija B+ drveta: https: //www. cs. usfca. edu/~galles/visualization/BPlus. Tree. html 30/49
B-drveta Više različitih tipova B-drveta – B+-drvo u B-drvetu svi ključevi po kojima se pretražuje i odgovarajući pokazivači na podatke su predstavljeni (negde) u drvetu, dok su u B+-drvetu svi pokazivači na podatke u listovima (sortirani po vrednostima sa leva u desno) čvor ima n vrednosti (ključeva pretrage) i n+1 pokazivač u čvorovima u sredini svi pokazivači pokazuju na čvorove na nižem nivou list sadrži n pokazivača na podatke i 1 pokazivač na naredni čvor u implementacijama moguće je da list sadrži n+2 pokazivača: n pokazivača na podatke, pokazivač na naredni čvor i pokazivač na prethodni čvorovi ne mogu da budu prazni, i koriste najmanje čvorovi u sredini : (n+1)/2 pokazivača na čvorove na narednom nivou listovi : (n+1)/2 pokazivača na podatke 31/49
+ B -drveta Čvorovi u sredini (n = 3) 10 20 30 pokazivači na levoj strani ključa pokazuju na čvor na nižem nivou sa ka ključevima< 10 manjom vrednošću ključa ka ključevima 10 ≤ k < 20 pokazivači na desnoj strani ključa ka ključevima 20 ≤ k < 30 pokazuju na čvor na nižem nivou sa ka ključevima 30 ≤ k istom ili većom vrednošću ključa List (n = 3) pokazivač sa središnjeg čvora (n pokazivača na podatke, 1 na sledeći list) na sledeći list pokazivač na levoj strani ključa je 10 20 30 u redu pokazivač na slog sa tom vrednošću ključa pokazivači na podatke a b c poslednji pokazivač pokazuje na 30 z 1 sledeći list u redu 20 10 x y 2 1 32/49
+ B -drveta Kompletno drvo (n = 3): 11 1 2 7 11 23 17 23 25 a . . . 25 23 17 11 7 2 1 . . • Drvo ima samo dva nivoa ali je dopušten proizvoljan broj nivoa • Svi listovi (pokazivači na podatke) su na istom nivou • Kako su listovi povezani, jednostavno je sekvencijalno čitanje podataka 33/49
+ B -drveta Upotrebom B+-drveta lako se proverava da li slog sa traženom vrednošću ključa postoji ili ne (npr. ovde ne postoji slog sa vrednošću ključa 6 niti slog sa vrednošću ključa 15 Koren 13 2* 3* 5* 7* 14* 16* 17 24 19* 20* 22* 30 24* 27* 29* 33* 34* 38* 39* 34/49
+ B -drveta: unošenje podataka Algoritam za unošenje podataka u B+ drvo a) b) c) d) Odrediti korektan list L Upisati novu vrednost u list L Ako postoji prostor unos je završen Ako ne postoji prostor § dodaje se novi list L 1 i podaci iz lista L se ravnomerno raspoređuju na L i L 1 tako da je svaki od njih pun bar do polovine kapaciteta; § unosi se bočni pokazivač sa L na L 1 i sa L 1 na prethodni naredni od L § srednji ključ se prepisuje u čvor na nivou iznad § unosi se pokazivač na list L 1 sa roditelj čvora lista L 35/49
+ B -drveta: unošenje podataka e) Podela čvora na jednom nivou utiče na čvor na višem nivou ako u njega treba da se unese pokazivač na ključ. Po potrebi, rekurzivno ponoviti postupak – ako postoji prostor uneti vrednost/pokazivač, a ako ne postoji podeliti čvor f) Ako se deli indeksni čvor, podaci se ravnomerno raspoređuju, ali se srednji ključ pomera naviše g) Izuzetak predstavlja koreni čvor – ako treba da se u njega unese podatak a ne postoji slobodan prostor tada se koreni čvor deli na dva i formira novi koreni čvor na višem nivou sa dva dete čvora h) Bez obzira na broj n korenom čvoru je dozvoljeno da ima samo jedan ključ i dva dete čvora. 36/49
+ B -drveta: unošenje podataka Zadatak: neka u narednom drvetu treba uneti pokazivač na slog sa ključem 10 Koren 13 2* 3* 5* 7* 14* 16* 17 24 19* 20* 22* 30 24* 27* 29* 33* 34* 38* 39* (1) Kako je 10<13 unos bi trebalo da se izvrši u krajnje levom listu (2) Pošto je list pun, dodaje se novi list u koji se prepisuju dve vrednosti (5, 7) (3) U novi list (prema uređenju) upisuje se vrednost 10 37/49
+ B -drveta: unošenje podataka Koren 13 2* 3* 14* 16* 5* 7* 17 24 19* 20* 22* 30 24* 27* 29* 33* 34* 38* 39* 10* (4) Srednji ključ (u odnosu na oba bloka – ovde 5) se podiže u čvor naviše (5) Kako je koreni čvor pun, deli se na dva čvora i formira novi koreni čvor. (6) Podaci se ravnomerno raspoređuju (5, 13, 17, 24, 30) pri čemu se 5 i 13 upisuju u levo dete čvor, 24 i 30 u desno dete čvor, a 17 se podiže u novi koren 38/49
+ B -drveta: unošenje podataka Izgled drveta posle unošenja sloga sa ključem 10 je Koren 17 5 2* 3* 24 13 5* 7* 10* 14* 16* 19* 20* 22* 30 24* 27* 29* 33* 34* 38* 39/49
+ B -drveta: brisanje podataka Algoritam za brisanje podataka iz B+ drveta je a) Odrediti korektan list L u kome se nalazi ključ koga treba obrisati b) Ako posle uklanjanja ključa list ima bar polovinu elemenata, brisanje je završeno c) U suprotnom, ako neki od susednih listova ima više od minimalnog broja ključeva i pokazivača, tada se od njega pozajmljuje par ključ/pokazivač, tako da se redosled ključeva ne menja. Pri tome se vodi računa da roditelj ključevi treba da pokazuju na novo stanje. d) Ako oba susedna lista imaju minimum parova, tada se spajaju dva susedna lista i briše jedan od njih. Broj ključeva/pokazivača u novom listu je manji od maksimuma (spojeni su listovi sa minimumom i manje od minimuma broja parova). e) Ažuriraju se ključevi roditelj čvora spojenih listova i izbriše par ključ/pokazivač u roditelj čvoru koji je pokazivao na izbrisani list f) Ako roditelj čvor ima manje od minimalnog broja parova, postupak se rekurzivno ponavlja, u suprotnom brisanje je završeno. 40/49
+ B -drveta: brisanje podataka Zadatak: izbrisati ključeve 19, 20 i 22 (tim redom) iz drveta koje je rezultat prethodnog primera sa unošenjem ključa sa vrednošću 10 Koren 17 5 2* 3* 24 13 5* 7* 10* 14* 16* 19* 20* 22* 30 24* 27* 29* 33* 34* 38* 39* 41/49
+ B -drveta: brisanje podataka • Brisanje ključa 19 je jednostavno • Brisanje ključa 20 povlači pozajmicu od lista sa desne strane koji ima dovoljan broj parova ključ/pokazivač (24, 27, 29), tako da 24 prelazi u list u kome se nalazi samo 22 • Vrši se ažuriranje ključeva u roditelj slogu – umesto 24 upisuje se prva vrednost koja je preostala u desnom listu - 27 Root 17 5 2* 3* 27 13 5* 7* 8* 14* 16* 22* 24* 30 27* 29* 33* 34* 38* 39* 42/49
. . . B+-drveta: brisanje podataka • Posle brisanja 22 ne ostaje dovoljno parova ni u jednom od susednih listova i zato se vrši spajanje lista čiji je sadržaj 24 i lista koji sadrži 27 i 29 • Ažurira se roditelj čvor; 27 se briše i kako 30 ostaje samo, a nema dovoljno parova ni u levom čvoru (sadrži 5, 13) vrši se njihovo spajanje. • Pošto koreni čvor ne može da ostane samo sa jednim dete čvorom, ponovo se primenjuje rekurzivni postupak i novi koreni čvor se dobija spajanjem starog korenog čvora i jedinog dete čvora, čime se završava postupak Root 5 2* 3* 5* 7* 8* 13 14* 16* 17 30 24* 27* 29* 33* 34* 38* 39* 43/49
+ B -drveta: duplikati Duplikati su dozvoljeni: - 1 2 7 7 7 11 7 23 11 17 23 25 Pokazivači iz korenih čvorova mogu da pokazuju na prvo pojavljivanje ključa koji je duplikat, dok se naredna pojavljivanja dobijaju sekvencijalnim čitanjem narednog lista U nekim situacijama pokazivač može da bude null (u primeru ne može da se postavi 7 kao vrednost u čvoru) 44/49
+ B -drveta: primene B+-drveta mogu da budu korišćena na više načina – npr. za implementaciju indeksa nad podacima iz baze Listovi mogu da se ponašaju kao gusti ili retki primarni indeksi gusti ili retki klasterovani indeksi koji dopuštaju duplikate (gusti) sekundarni indeksi (nad nesortiranim slogovima) . . . Ne-list čvorovi služe za ubrzavanje pretraživanja 45/49
+ B -drveta: efikasnost pretraživanje uvek mora da počne od korena – broj blokova koji se čitaju je jednak visini drveta plus broju pristupa slogovima broj nivoa je obično relativno mali – najčešće 3 upiti sa intervalima se veoma brzo izvršavaju – pronađe se leva granica i zatim se vrši sekvencijalno čitanje ako je n dovoljno veliko, podela i spajanje će biti relativno retki U/I operacije sa diska mogu biti smanjene ako se koreni blok stalno drži u memoriji tako da je samo mali broj U/I operacija potreban za pristup slogu U praksi se zbog performansi ne radi uvek podela/spajanje listova i čvorova. U slučaju velikog broja unosa/brisanja slogova potrebno je raditi eksplicitnu reorganizaciju 46/49
Multidimenzionalno klasterovanje Za razliku od klasterovanja tabela po jednoj dimenziji, kod multidimenzionog klasterovanja podaci su organizovani (smešteni) po blokovima saglasno vrednostima (dimenzija) po kojima se klasteruju. SELECT * FROM MDCTABLE WHERE COLOR='BLUE' AND NATION=‘Srbija' Blue Resulting BID list of resulting blocks to scan Key from dimension block index on Nation Key from dimension block index on Color 4, 0 12, 0 48, 0 52, 0 76, 0 100, 0 216, 0 Srbija 12, 0 76, 0 92, 0 100, 0 112, 0 216, 0 276, 0 + 12, 0 76, 0 100, 0 216, 0 = 47/49
Multidimenzionalno klasterovanje • • Svaka dimenzija ima svoj (privatni) indeks Indeksi su mali jer pokazuju na blokove slogova i mogu biti čuvani u memoriji Unosi se indeks kada se unese prvi slog u bloku, a briše kada se izbriše poslednji Može da dovede do povećanja veličine tabele na disku ako se izaberu neodgovarajuće dimenzije Row Indexes: 1 index entry per row Block Indexes: 1 index entry per block = Row = Extent (block) 48/49
Multidimenzionalno klasterovanje Primer: formiranje tabele sa multidimenzionalnim klasterovanjem podataka Primedba: multidmenezionalno klasterovanje se ne primenjuje na tabele organizovane po kolonama. create table db. Dosije_MDC ( Indeks integer not null, Id. Programa integer not null, Ime varchar(100) not null, Prezime varchar(100) not null, Pol char, Mesto. Rodjenja varchar(100), Id. Statusa smallint not null, Dat. Upisa date not null, Dat. Diplomiranja date, primary key( Indeks ), foreign key fk_Dosije_Program( Id. Programa ) references db. Studijski. Program, foreign key fk_Dosije_Status( Id. Statusa ) references db. Studentski. Status ) ORGANIZE BY DIMENSIONS((Idprograma, Ime), (Id. Statusa)) ; 49/49
- Slides: 49