TECHNICKÁ UNIVERZITA V KOŠICIACH FAKULTA ELEKTOTECHNIKY A INFORMATIKY Indexácia Vypracovali: Róbert Vaško Peter Nusios
1. Úvod do Indexov Indexácia je mechanizmus na efektívne vyhľadávanie riadkov bez prehľadávania celej tabuľky. Je založený na vyhľadavacom kľúči : postupnosť atribútov. Riadok, ktorý má čiastočné hodnoty pre kľúč, môže byť rýchlo nájdený. Viacej riadkov môže mať rovnaké hodnoty pre vyhľadávací kľúč. 2. Formát Indexu. 2.1 Štruktúra Indexu. Index obsahuje: 1. Indexové položky: 1.1. Môže byť samotný riadok tabuľky. 1.2. Hodnota kľúča a smerník na riadok, ktorý má túto hodnotu 2. Vyhľadávací mechanizmus: 2.1. Algoritmus a dátová štruktúra na vyhľadávanie položky s určitou hodnotou vyhľadávacieho kľúča. 2.2 Dátová štruktúra Pod dátovou štruktúrou budeme rozumieť štruktúru súboru obsahujúcu samotnú tabuľku. Môže byť tvorená, týmito abstraktnými štruktúrami : Heap (neobsahujúca indexovú štruktúru) Zotriedený súbor (neobsahujúci indexovú štruktúru) Integrovaný súbor obsahujúci indexovú štruktúru a riadky (položka indexu obsahuje riadok v týchto prípadoch). V tomto prípade sa jedná o tieto údajové štruktúry :! ISAM (Indexed Sequencial Access Method)! B + strom.! Hash tabuľka. Obr.1. : Integrovaná dátová štruktúra.
Obr. 2. : Indexový súbor s oddelenou dátovou štruktúrou. 2.3 Klastrovaný / Neklastrovaný Index Klastrovany (hlavný) index : Indexové položky a riadky sú usporiadané rovnakým spôsobom.! Integrovaná dátová štruktúra je vždy klastrovaná.! V tabuľke môže byt len jeden klastrovaný index.! Je výhodný na intervalové hľadanie.! Využíva vyhľadávací mechanizmus na nájdenie indexovej položky na začiatku intervalu. Teda vyhľadáva prvý dátový záznam.! Ak index je klastrovaný nasledujúce dátové záznamy sú susedné (teda súvisia medzi sebou).! Minimalizuje stránkový prenos a maximalizuje pravdepodobnosť nájdenia stránky v cache pamäti. Neklastrovaný (vedľajší) index : Indexové položky a riadky nie sú nie sú usporiadané podľa rovnakého kľúča.! Indexový súbor môže byť klastrovaný alebo neklastrovaný s ohľadom na dátovú štruktúru na, ktorú sa odkazuje.! V tabuľke môže byt viac neklastrovaných indexov. Obr. 3. : Klastrovaný a neklastrovaný index.
Príklad na vyhľadanie intervalu : Máme dátový súbor (typu heap), ktorý má 10000 stránok. (100 riadkov v intervale).stránkový prenos je 20 riadkov na stránku. Aká je cena C (teda počet prehľadávaní tabuľky)??? log 2 10000 (vyhľadanie začiatku) + 5 (dátových položiek) 19 Neklastrovaný index : 100 (záleží na usporiadaní) Klastrovaný index : 5. 2.4 Husté a Riedke Indexy Hustý (Dense) index : indexová položka pre každý dátový záznam (Neklastrovaný index musí byť vždy hustý). Riedky (Sparse) index : jeden index pre každú stránku dátového súboru.! Ak je vyhľadavací kľúč príbuzný kľúč dátového súboru, potom sú dáta nájdené.! Ináč sú požadované ďalšie kritéria: začiatok vyhľadávania na predchadzjúcej stránke. ID Name Dept Riedky, klastrovaný index zoradený podľa ID. Dátový súbor zoradený podľa ID. Obr. 4. : Dense vs. Sparse Index. Hustý, neklastrovaný index zoradený podľa Name.
3. Viacúrovňové indexy 3.1 Dvojúrovňový index Obr. 5.: Dvojúrovňový index Prvá úroveň je riedky index nad stránkami indexový položiek. Druhá úroveň obsahuje samotné indexové položky. Indexové položky môžu obsahovať riadky (integrovaná dátová štruktúra) alebo smerníky na oddelenú dátovú štruktúru. V tomto prípade môže byť index neklastrovaný. Cena v prvej úrovni << cena v druhej úrovni, pretože prvá úroveň sa skladá z riedkych indexov Cena (Q stránky druhej úrovne, 100 položiek na stránku) = log 2 (Q / 100) + 1. 3.2 Viacúrovňový index Obr. 6. : Viacúrovňový index. Cena = počet úrovní v strome. Ak Φ je počet vetiev koreňovej stránky, potom cena je log Φ Q + 1.
4. Primárne organizácie indexov. 2.2 ISAM: Indexed Sequential Access Method ISAM je statický viacúrovňový index. Vytvára sa pri vytváraní tabuľky (CREATE TABLE) a potom sa už nemení. Nie je vhodný pre dynamické vkladanie a mazanie. Vkladanie sa vykonáva pomocou prepísania stránok (overflow pages). 2.3 B Stromy B strom je špeciálnym prípadom vyváženého n-árneho orientovaného koreňového stromu- Je zovšeobecnením 2-3 stromov. Každý nelistový vrchol (okrem koreňa) má počet synov v intervale <n/2, n>. Koreň B stromu je buď koreňom alebo má aspoň 2 synov Všetky listy majú rovnakú hľbku. Vlastnosti B stromov :! B stromy možno považovať za hierarchický index.! Koreň B stromu je index prvej úrovne.! Každý nelistový vrchol má tvar (p 0 k 1 p 0 k 1 k n p n ), kde pi je smerník na i-té dieťa a ki je kľúč.! Kľúče sú usporiadané.! Kľúče v podstrome referencovanom p i majú vlastnosť : kde p i majú vlastnosť : k i k < k i+1.! B stromy podporujú tieto operácie :! Vkladanie (INSERT): nájsť listový uzol, do ktorého má byť nová položka zaradená ak uzol nie je plný, zaradiť a koniec ak uzol je plný, rozdeliť ho na dva uzly, vykonať redistribúciu položiek a vložiť novú položku o úroveň vyššie (môže dôjsť k zmenám až do úrovne koreňového uzla)! Odobratie (DELETE): nájsť uzol, v ktorom sa nachádza položka ak je počet položiek väčší ako minimálny, potom vyradiť, ak je počet položiek rovný minimálnemu zlúčiť dva vedľajšie uzly, čo vyvolá vyradenie jednej položky z nadradeného uzla možná zmena až do úrovne koreňového uzla.! Vyhľadanie (SEARCH) pre kľúč X: 1. nastav PTR sa na koreňový uzol 2. prečítaj uzol PTR 3. nájdi takú maximálnu položku K i v uzle, aby X K i resp. urči, či X > K q-1 4. ak X = K i, čítaj blok (záznam) Pr i choď na bod 7 5. ak X < K i, PTR = P i a pokračuj bodom 2 6. ak X > K q, PTR = P q a pokračuj bodom 2 7. KONIEC 4.2 B + stromy Sú to B stromy, u ktorých odkazy na záznamy sú uložené len na úrovni listových položiek. Listové položky sú zvyčajne zreťazené, aby poskytovali sekvenčný prístup (P next, niekedy aj P previous ) Štruktúra interných uzlov: 1. Každý interný uzol B + -stromu má formu <P 1,K 1,P 2,K 2,...,P q-1,k q-1,p q > kde q p a P i je odkaz na ďalší uzol B + -stromu (B + -podstrom). 2. V každom internom uzle platí K 1 < K 2 <... < K q-1 3. Pre všetky hodnoty kľúča X v podstrome, na ktorý odkazuje P i, platí K i-1 < X K i, pre 1<i <q, X K i pre i = 1, a K i-1 < X pre i = q 4. Každý interný uzol má najviac p odkazov na podstromy 5. Každý interný uzol (okrem koreňového) má najmenej (p/2) odkazov na podstromy. Koreňový uzol má najmenej dva odkazy na podstromy, za predpokladu, že je interným uzlom. 6. Uzol s q odkazmi na podstromy (q p), obsahuje q-1 hodnôt kľúčov
Štruktúra listových uzlov 1. Každý listový uzol B + -stromu má formu < <K 1,Pr 1 >,<K 2,Pr 2 >,...,<K q-1,p q-1 >,P next > kde q p. Pr i je odkaz na zodpovedajúci záznam a P next odkazuje na ďalší listový uzol B + -stromu. 2. V každom listovom uzle platí K 1 < K 2 <... < K q-1, 3. Pr i odkazuje na záznam, hodnota kľúča ktorého je K i alebo na blok súboru, obsahujúci tento záznam. V prípade, že máme index nad nekľúčovou položkou, potom Pr i odkazuje na blok odkazov na záznamy s rovnakou hodnotou K i ) 4. Každý listový uzol má najmenej (p/2) hodnôt. 5. Všetky listové uzly sú na rovnakej úrovni stromu (strom je vždy vyvážený). Interné a listové uzly môžu mať rozličný blokovací faktor (p int pre interné uzly a p list pre listové uzly). B + -strom podporuje porovnávacie aj intervalové vyhľadávanie, vyhľadávanie na základe viacnásobných ale aj čiastočných kľúčov. Na rozdiel od ISAM, je vhodný na dynamické zmeny v tabuľkách. Maximálna cena vyhľadávania je rovná C = log Φ/2 Q + 1. Obr. 7. : Štruktúra B + -stromu 2.3.1 Operácie nad B + -stromom Algoritmus pre vkladanie a mazanie musí vždy brať ohľad na to aby bol strom vyvážení. Operácia INSERT: 1) Nájdi kľúč, ktorý sa bude vkladať. 2) Ak je priestor pre ďalší smerník v liste, vlož ho tam. 3) Ak nie je, rozdeľ list: 4) Rozdeľ list a pokračuj v bode 2) 5) Takto, rekurzívne rozdeľ všetky cesty v strome, pokiaľ je to možné. 6) Uprav všetky kľúče v strome, pokiaľ sa strom zmenil. Operácia DELETE: 1) Nájdi kľúč, ktorý sa má zmazať. 2) Ak sa našiel, zmaž ho. 3) Ak spodná hranica na obsadenom mieste je porušená 4) Najprv sa pozri v susednom liste, ktorý je nad spodnou hranicou; Ukradni smerník z tohoto listu. 5) Ak nič, potom musia byť dva listy v strome, ktoré je jeden v minime a druhý pod minimom V tom prípade spoj uzly. 6) Pokus sa zmazať spojené uzly. 7) Uprav všetky kľúče v strome, pokiaľ sa strom zmenil.
Pozn. Niekedy je v poriadku nechať list B + -stromu pod minimom, bez spájania listov. Operácia SEARCH: 1) Začni v hlavnom koreni B + -stromu. 2) Pokiaľ nedosiahneme list, nasleduj smerník, ktorý nás dovedie ku kľúču, ktorý hľadáme. 3) Nájdený list (alebo listy, ak sú možné duplikáty). 2.2 Hash Index Indexové položky sú rozdelené do oblastí (buckets) podľa hašovacej funkcie h(v), kde v je interval nad hodnotami vyhľadávacieho kľúča.! Každá oblasť je identifikovaná adresou a.! Oblasť nad adresou a obsahuje všetky indexové položky s vyhľadávacím kľúčom v.! Ak záznam s vyhľadávacím kľúčom v existuje, potom musí byť v oblasti h(v).! Každá oblasť je uložená v stránke.! Ak indexové položky obsahujú riadky, zoznam oblastí formulujú údajovú štruktúru Neklastrovaný indexový súbor.! Znižuje nám to prehľadávanie o hodnotu a.! Vykonáva sa len jedna I/O operácia, ak je len jeden blok na oblasť. Operácia SEARCH: Je dané v: 1. Vyhodnoť h(v). 2. Vyber oblasť v h(v). 3. Nájdi túto oblasť. 2.2.1 Operácie nad hash tabuľkou Cena = počtu stránok v oblastí (menšia než u B + stromov, za určitých podmienok). Obr. 8. : Operácia SEARCH nad hash table. Operácia INSERT: 1. Vlož oblasť h(v), ak sa vmestí do stránky, ináč vytvor vyplnenú stránku (overflow page), ktorá je súčasťou oblasti. Obr. 9. : Vloženie záznamu s kľúčom g. Operácia DELETE: 1. Vyhodnoť h(v). 2. Nájdi oblasť pre záznam s kľúčom v. 3. Zmaž záznam s kľúčom v. Jako vypočítať hodnotu pre h(v)? 2.2.2 Hash funkcia
Tak, aby obsadenie oblasti bolo približne rovnaké. Napríklad: h(v) = (a*v +b) * mod M.! M musí byť dostatočne veľké, aby minimalizovalo výskyt vyplňvacích stránok.! M nesie byť príliš veľké, aby nám zbytočne nezaplňoval miesto v dátovom alebo idexovom súbore. Efektivita algoritmu je najväčšia, ak počet záznamov < počet oblastí * počet záznamov na blok. 2.2.3 Nevýhody hash indexov Hash indexy nepodporujú intervalové vyhľadávanie. Hoci podporuje mnohonásobné kľúče, nepodporuje vyhľadávanie na základe čiastočných kľúčov. Dynamické vzrastanie veľkosti hash indexového súboru produkuje vyplňujúce stránky, ktoré znižujú efektivitu tohoto algoritmu. Ako to vyriešiť? Použijeme metódy dynamického hašovania. Ktoré sú: Rozšírené hašovanie: Zdvojnásobenie počtu oblastí, pokiaľ je to potrebné. Lineárne hašovanie : pridáme ďalšiu oblasť, ak je to vhodné. 2.2.4 Rozšírené hašovanie Interval hašovacej funkcie je rozšírený, aby vyhovoval prídavným oblastí. Teda: h k (v) = h(v) * mod 2 k (použi posledných k bitov z h(v)). V akomkoľvek danom čase mamé unikátnu hash funkciu, h k je použité v závislosti na tom koľkokrát sme danú oblasť rozdelili. Nevýhody: Extra priestor pre adresár. Ak adresár sa nevmiesti do pamäti, potom musíme preniesť ďalšiu stránku do pamäte. 2.2.5 Lineárne hašovanie Použi k bitov z pravého konca h(v). Oblasti očísluj [0 n-1], kde 2 k-1 < n < 2 k Nech posledných k bitov z h(v) bude m = (a 1 a 2 a n ). 1. Ak m < n, potom záznam patrí z oblastí m. 2. Ak n m < 2 k, potom záznam patrí z oblasti m 2 k-1. 2.3 Ďalšie stromy V Databázových systémov sa používaju aj ďalšie idexové štruktúry, ktoré si uz len pripomenieme. B* stromy je B + strom v ktorom sú uzly zaplnené na 2/3. Štvorcové stromy v, ktorom sa rozdeľujú naraz všetky rozdiely. R stromy : sú zovšeobecnením B stromov v viacrozmernom prípade. 3 Vybratie vhodnej indexovej štruktúry Index by mal podporovať dotaz aplikácie, ktorý ma najväčí dopad na výkonosť. Teda výber závisí od frekvencie dotazov, času vykonávania, potrebných uzamknutí a veľkosti tabuľky. Pr. 1: SELECT E.Id FROM Employee E WHERE E.Salary < :upper AND E.Salary > >lower Vyberieme B + strom s vyhľadavacím kľúčom = Salary. Pr. 2: SELECT T.CrsCode, T.Grade FROM Transcript T WHERE T.StudId = :Id AND T.Semester = F200 Vyberieme B + strom alebo hash s vyhľadávacím kľúčom StudId, pretože Semester nie je tak dobre selektívny ako StudId.
4 Použitá literatúra 1. Jeffové slajdy z DBMS. www-db.standford.edu/~ulllam 2. Jenyfferine slajdy z DBMS www-db.standford.edu/~ulllam 3. Liberios Vokorokos : Programovacie techniky v príkladoch. 4. Mysql-manual.pdf www.mysql.com 5. SQL98 Reference www.postgresql.org 6. PostgreSQL documentation www.postgresql.org 7. Nejake prednášky s DBMS stiahnuté z neznámeho FTP archívu. www.altavista.com