Téma 11 Přístup k datům Obsah 1. Organizace ukládání dat Záznamy pevné a proměnné délky Sekvenční organizace souborů Organizace "multi-table clustering" 2. Indexování Podstata indexování Hustéa řídkéindexy B+ stromy a jejich vlastnosti 3. Hašování Princip hašování Statické hašování Dynamické rozšiřitelné hašování Organizace ukládání dat Přístup k datům 1 Přístup k datům 2 Databáze a soubory Databáze je uložena jako soustava souborů(files). Každý soubor je posloupnost záznamů(records). Záznam je posloupnost polí(fields), obvykle odpovídajících atributům Základnípřístup Předpoklad: každý záznam má pevnou délku Každý soubor obsahuje záznamy jediného konkrétního typu Každá datová relace je v samostatném souboru Snadná implementace Záznamy pevné délky m bytů i-tý záznam začínána pozici m (i 1) Přístup k záznamům je velmi jednoduchý Viz služba lseekpro práci se soubory Výmaz záznamu i alternativy: i+1,..., nna i,..., n 1 přesuňzáznam n na místo i-tého nepřesouvej nic, ale udržuj seznam smazaných záznamů, tj. volného místa Přístup k datům 3 Seznamy volného místa Ulož adresu prvního smazaného záznamu v záhlaví souboru Použij místo po zrušeném záznamu k uloženíadresy druhého smazaného záznamu, atd. Uložené adresy jsou odkazy (pointery) odkazují na příští zrušený záznam Při vkládání záznamů se použije místo po zrušených záznamech Přístup k datům 4
Záznamy s proměnnou délkou Záznamy s proměnnou délkou se používajízřídka. Mohou vzniknout při potřebě uložení různých záznamů v jednom souboru uložení záznamů s poli (atributy) proměnné délky Stránkovanésoubory Soubor = množina stránek(bloků) fixní velikosti Záhlaví stránky obsahuje Počet záznamůve stránce Odkaz na konec volného místa Pozici a délku každého záznamu Záznamy lze uvnitř stránky libovolně přesouvat a šetřit tak místo Odkazy na záznamy v souboru jsou tvořeny dvojicemi (číslo_stránky, číslo_záznamu_ve_stránce). Neodkazujíse přímo záznamy, ale údaje v Délka záznamu Umístění záhlaví stránek Počet zázn. Záhlaví Volno Organizace záznamů v souborech Umísťování záznamů může výrazně ovlivnit přístupové doby zpravidla se vyhledává prostřednictvím klíče(asociativní paměť) Halda záznam se umístív souboru kamkoliv, kde je místo Sekvenční organizace záznamy se ukládají v pořadí daném hodnotou vyhledávacího klíče záznamu Hašování hašovacífunkce počítanáz vhodného atributu záznamu (klíče) určíčíslo bloku v souboru, kam bude záznam umístěn Záznamy každérelace se zpravidla ukládajído samostatných souborů. V organizaci označovanéjako "multi-table clustering" se záznamy různých relací ukládají do jednoho souboru Motivace: ukládej logicky spolu souvisejícízáznamy do jednoho bloku s cílem minimalizace I/O operací Ukazatel na konec volného místa Přístup k datům 5 Přístup k datům 6 Sekvenční organizace souboru Velmi vhodné pro aplikace, kdy se požaduje sekvenční zpracování celé tabulky Záznamy jsou řazeny podle vyhledávacího klíče Uspořádanésekvenčnísoubory umožňujívelmi rychlý přístup k datům Půlení intervalu logaritmická(sub-lineární) složitost Údržba je avšak extrémně obtížná Proto je obvykle ke každému záznamu připojen odkaz na "logicky následující" záznam Sekvenční organizace souboru (pokr.) Výmaz řetězec odkazů přeskočí smazaný záznam Vložení najdi pozici, kam záznam vložit je-li tam volno, vložho tam pokud ne, vložzáznam do tzv. bloku přeplnění V každém případěje nutno aktualizovat řetězec odkazů Reorganizace souboru Čas od času se musísoubor reorganizovat, aby se obnovilo plnésekvenčníuspořádání, a tak bylo používat efektivní (sub-lineární) hledání Přístup k datům 7 Přístup k datům 8
Organizace "multi-table clustering" Uložení několika relací v jednom souboru s organizací multi-table clustering Relace depositor a customer uložené v jednom souboru Vhodnépro dotazy typu depositor customera dotazy týkajícíse jednoho zákazníka a jeho účtů Neefektivní, kdyžse dotaz bude týkat jen zákazníka Vede na záznamy s proměnnou délkou Lze téžpřidat řetězce odkazůspojujících záznamy patřící k jedné ze zobrazovaných relací Uložení slovníku dat Slovník dat(data dictionary, system catalog) obsahuje údaje o datech (metadata) Informace o relacích jména relací, jména a typy atributů každé relace, integritní omezení jména a definice pohledů Informace o právech uživatelů, včetně zakódovaných hesel Údaje o fyzické organizaci souborů Jak je která relace uložena (sekvenčně/hašovaná/...) Fyzická lokalizace relace (v kterém souboru,...) Údaje o indexech a dalších strukturách Struktura slovníku dat Relační reprezentace na disku Možná reprezentace soustavou relací(tabulek) podle schémat: Přístup k datům 9 Přístup k datům 10 Základní myšlenka indexace Indexy zrychlují hledání v datech podle klíče např. autorský index v knihovně Indexní soubor sestává ze záznamů ve tvaru Indexace a indexní soubory Přístup k datům 11 Indexní soubory bývají výrazně menší než původní soubory s daty mnohdy se celévejdou do operačnípaměti Dva základní typy indexů: Setříděné indexy: soubor je setříděn podle klíčů Hašovanéindexy: klíče jsou rovnoměrněrozloženy v "blocích" referencovaných hašovací funkcí Měřítka pro hodnocení efektivní organizace indexů Podporované typy vyhledávání, např. záznamy s konkrétníhodnotou klíče (či jiného atributu) versuszáznamy s hodnotou klíče v zadaném intervalu hodnot Doba přístupu Náročnost operací vkládání a výmazu dat Prostorová(paměťová) náročnost (režie) Přístup k datům 12
Setříděné indexy Při setříděných indexechjsou položky indexního souboru setříděny a uloženy podle hodnot prohledávacího klíče Např. autorský katalog v knihovně Index může být prohledáván iterovaným půlením Primárníindex: index určujícípořadízáznamův sekvenčně organizovaném souboru Prohledávací klíč primárního indexu je obvykle (i když ne nutně) primárním klíčem relace POZOR: Nejde-li o primární klíč relace, může k jedné hodnotě prohledávacího klíče existovat více datových záznamů Sekundárníindex(y)určujípořadíjiné, nežje určeno primárním indexem Vhodnépro setříděnévýpisy či prohledáváníodlišnéod primárního indexu Index-sekvenčnísouboroznačuje setříděný datový soubor s primárním indexem a vše je spojeno do jediného diskového souboru Husté a řídké indexy Hustý indexobsahuje záznamy pro všechny hodnoty prohledávacího klíče Řídké indexy obsahují odkazy pouze na některé hodnoty klíčů Použitelné jen když datové záznamy jsou setříděné podle stejného klíče Řídké vs. husté indexy Menšía méněrežie spojené s rušením a vkládáním záznamů Obecněpomalejšínežhustéindexy při vyhledávání Výhodnéa nejčastějšíužití:řídký index s položkami odkazujícími na prvnízáznam podle klíče v každém alokačním bloku datového souboru Přístup k datům 13 Přístup k datům 14 Víceúrovňové indexy Pokud se primárníindex nevejde do paměti, vyhledávánízačne být nákladné Řešení: považuj primárníindex uložený na disku za sekvenčnísoubor a vybuduj k němu řídký index vnějšíindex = řídký index primárního indexu vnitřníindex = primárníindex k datům Je-li i pak vnějšíindex příliš velký, vytvoř další úroveň, atd. Problém: Při vkládání či mazání záznamůje nutno aktualizovat všechny nadřazené úrovně indexů Přístup k datům 15 Aktualizace indexů Mazánízáznamů Pokud mazaný záznam je jediný záznam s danou hodnotou prohledávacího klíče, pak je nutno smazat i příslušnou indexní položku Výmaz při jednoúrovňových indexech: Husté indexy analogické výmazu datového záznamu Řídké indexy jestliže hodnota prohledávacího klíče mazaného záznamu v řídkém indexu je, dojde k vymazání náhradou této hodnoty další hodnotou klíče jestliže dalšíhodnota prohledávacího klíče jižv řídkém indexu existuje, pak místo náhrady jen klíč vymaž Vloženízáznamu Jednoúrovňové indexy: Pomocí stávajícího indexu najdi, kam má vkládaný záznam přijít Hustéindexy není-li vkládanáhodnota prohledávacího klíče v indexu, vlož ji Řídké indexy(případ, kdy index odkazuje první záznam v alok. bloku) je-li v indexu položka pro blok, kam se nový záznam umístí, nenínutnážádná úprava, pokud se nevytváří další blok je-li nutno vytvořit dalšíblok, pak prvníhodnota v novém bloku se musívložit do indexu Rušenía vkládánízáznamůpři víceúrovňových indexech je rekurzívním zobecněním jednoúrovňových operací Přístup k datům 16
Sekundární indexy Často chceme nalézt všechny záznamy, jejichžhodnota určitého atributu (ne nutněprimárního klíče) splňujedanou podmínku Příklad 1: V relaci accountuloženésekvenčněpodle čísla účtu chceme najít všechny účty v dané pobočce Příklad 2: stejnějako v předešle, avšak navíc chceme najít jen účty s určitým konkrétním zůstatkem či dokonce se zůstatkem v zadaném rozmezí Můžeme budovat sekundárníindexy s položkami pro jiné než primární klíče Sekundárníindexy musíbýt husté(proč?) Indexní záznam ukazuje na skupinu obsahující reference na všechny záznamy s určitou hodnotou sekundárního prohledávacího klíče Primárnía sekundárníindexy vlastnosti Indexy přinášejíjasnévýhody při hledánízáznamůpodle hodnot prohledávacích klíčů Avšak: Aktualizace indexůpůsobírežijnínáklady při aktualizaci databází jakmile je změněn obsah datového souboru, musíbýt modifikovány všechny indexy přidružené k těmto datům Sekvenčníprohlíženípodle primárního indexu je velmi efektivní, ale prohlíženídle sekundárního indexu je mnohem nákladnější každý přístup k záznamu může znamenat nahránínového alokačního bloku souboru z disku nahrání bloku potřebuje řádově milisekundy oproti řádově10 100 ns při přístupu do hlavnípaměti Přístup k datům 17 Přístup k datům 18 Indexní soubory s B+ stromy Indexy s B+ stromyjsou alternativou k index-sekvenčním souborům Nevýhody index-sekvenčních souborů Jak soubory rostou, degraduje se jejich účinnost přílišmnoho bloků přeplnění => nutnost periodické reorganizace souborů Výhoda indexůs B+ stromy Automatickáreorganizace při malých, lokálních, změnách způsobených vkládáním a rušením jednotlivých záznamů Reorganizace celého souboru za účelem zachovánívýkonnosti není nutná (Menší) nevýhoda B+ stromů vyšší režie při vkládání a rušení záznamů větší paměťové(prostorové) nároky Výhody výrazně převyšují nevýhody B + -stromy se používajívelmi často Indexy s B+stromy B+ strom je stromová datová struktura reprezentující uspořádaná data a respektující existenci bloků dat Umožňuje efektivní vyvolávání, vkládání a rušení záznamů identifikovaných klíčem Jde o dynamický víceúrovňový stromověorganizovaný index, přičemž existují omezení na maximální a minimální počet klíčů v každém uzlu stromu B+ strom má následující vlastnosti Všechny cesty od kořene k listu stromu jsou stejnědlouhé Každý vnitřníuzel stromu mámezi n/2 a nnásledníky, kde n se nazývá řád stromu(též faktor větvení) nzávisína velikosti klíče a velikosti alokačního bloku souboru; n 100 List stromu obsahuje (n 1)/2 až n 1 hodnot klíčů Výjimky: K3 K5 Pokud kořen nenílistem, máaspoň2 následníky Je-li kořen zároveň listem (tj., strom nemá vnitřníuzly), může obsahovat 0 až(n 1) hodnot B+ strom při n=3 K1 K2 K3 K4 K5 K6 K7 Přístup k datům 19 d 1 d 2 d 3 d 4 d 5 d 6 d 7 Přístup k datům 20
Struktura uzlů B+ stromu Typický uzel stromu P 1 K 1 P 2 K 2 P n-1 K n-1 P n K i jsou hodnoty prohledávacího klíče P i jsou odkazy (ukazatele) na následníky (pro nelistovéuzly) nebo odkazy na datové záznamy (či jejich skupiny) pro listy Klíče v uzlu jsou uspořádány K 1 < K 2 < K 3 <...< K n 1 Nelistovéuzly tvořívíceúrovňový řídký index listových uzlů. Pro nelistovéuzly s modkazy platí, že podstrom odkazovaný P 1 obsahuje klíče s hodnotou K 1, pro 2 i n 1 platí, že podstromy odkazované P i majíklíče s hodnotami λ,kde K i 1 λ< K i, a uzel referencovaný P n obsahuje hodnoty > K n 1 Pro listy platí Pro i= 1, 2,..., n 1, ukazatel P i buďodkazuje přímo datový záznam s klíčem K i, nebo odkazuje skupinu dalších ukazatelůna více datových záznamůs klíčem K i. Druhý případ je nutný, pokud nejde o primárníklíč, kdy v datech je více záznamů se stejným prohledávacím klíčem V listech L i a L j při i < jplatí, klíče v L i jsou menšínežklíče v L j P n ukazuje na následujícílist To umožňuje uspořádané výpisy bez procházení stromu Přístup k datům 21 Příklad B+ stromu pro primární index A-102 A-249 Datové záznamy B+ strom pro soubor s relací account s primárním klíčem account_id při n = 3 Přístup k datům 22 Příklad B+ stromu pro neprimární index B+ strom pro soubor s relací account s neprimárním klíčem account_city při n = 3 Skupiny ukazatelů pro neprimární index. Bude nutná realizace záznamy proměnné délky! Poznatky o B+ stromech Protože vazby mezi uzly jsou realizovány ukazateli, logicky blízké bloky nemusí být blízké fyzicky oddělení logiky od implementace může ale snížit efektivitu Nelistové uzly tvoří hierarchii řídkých indexů B+ stromy jsou poměrně"mělké" majímalý počet úrovnía od kořene k listu vede krátkácesta V úrovni pod kořenem je minimálně2* n/2 hodnot klíčů Dalšíúroveňobsahuje aspoň2* n/2 * n/2 hodnot... atd. Je-liv datovém souboru Khodnot prohledávacího klíče, pak hloubka stromu nenívětšínež log n/2 (K) pro K=1.000.000 a n=100 je hloubka maximálně log 50 (1.000.000) = 4 Vkládánía výmazy záznamůz datového souboru jsou relativněrychléa mohou být prováděny v logaritmickém čase Přístup k datům 23 Přístup k datům 24
Prohledávání B+ stromů Najdi všechny záznamy s hodnotou klíče = k 1. Node root 2. repeat 1. Hledej v Nodenejmenšíklíč K i > k 2. Pokud takováhodnota v Nodeexistuje Node P i [krok ve stromu dolů] 3. Jinak k K n 1 a pak Node P n [krok ve stromu "vodorovně"] until Node je list stromu 3. Prohledej list stromu 1. Pokud pro nějaké iplatí K i = k, použij ukazatel P i a přejdi na hledaný záznam nebo skupinu záznamů 2. V opačném případě záznam s klíčem k neexistuje Velikost uzlu je obvykle shodná s velikostí bloku souboru typicky 4 KiBa nje obvykle okolo 100 ( 40 bytůna položku) Je-li hodnot klíče 1 milión a n = 100, pak do paměti budou nahrány nejvýše log 50 (1.000.000) = 4 uzly (bloky) a budou prohledány Pokud by byly použity klasickévyváženébinárnístromy, potřebovali bychom binárnístrom s hloubkou 20 a tedy 20 přístupůna disk A každý přístup na disk je v řádu 10 ms Vkládání do B+ stromů Základní algoritmus 1. Najdi list, kam by vkládaný záznam měl patřit 2. Pokud hodnota klíče užv listu existuje 1. jde-li o index k primárnímu klíči => CHYBA 2. přidej záznam do dat a je-li to třeba, přidej ukazatel do skupiny 3. Neexistuje-li hodnota klíče v listu, pak 1. přidej záznam do dat a případně vytvoř skupinu ukazatelů 2. Je-li v listu místo, přidej pár (klíč, ukazatel) 3. Není-li místo, vzniká problém: Uzel je třeba rozdělit na dva Rozdělení listového uzlu Vezmi n párů(klíč, ukazatel), včetně nově vkládaného, a setřiď je. Prvních n/2 vloždo původního uzlu a zbytek umísti do bloku tvořícího nový uzel Nechťukazatel na nový uzel je pa kje nejmenšíklíčv novém uzlu. Vlož(k, p) do uzlu nadřazeného rozdělovanému listu Je-li nadřazený uzel plný, je nutno propagovat rozdělování směrem ke kořeni, dokud nenínalezen uzel, v němžje volno V nejhorším případěje nutno rozdělit kořenový uzel a zvětšit hloubku stromu o 1 Přístup k datům 25 Přístup k datům 26 Úprava B+-stromu: příklad vložení B+ strom před a po vloženízáznamu s klíčem A-118 Výmazy z B+-stromů Najdi rušený záznam Vymažho z datového souboru a popř. ze skupiny ukazatelů Jestliže skupina ukazatelůje prázdná(nebo vůbec neexistuje), odstraň pár (klíč, ukazatel) z listového uzlu Má-li list po odstraněnípáru přílišmálo položek a jeho "horizontální" soused jich takénemádostatek, je nutno spojit dva "horizontálně" sousední uzly v jeden: Vložpáry z obou uzlůdo prvního a zrušdruhý uzel Vymažpár (K i 1, P i ),kde P i je ukazatel na smazaný uzel v nadřazeném uzlu; rekurzívně aplikuj tuto proceduru směrem ke kořeni Má-li list po odstraněnípáru přílišmálo položek a jeho "horizontální" soused jich mádost, pak přerozděl položky v sousedních uzlech Přerozděl položky tak, aby oba uzly měly přibližně stejně položek Aktualizuj odpovídající klíč v nadřazeném uzlu Rušeníuzlůmůže kaskádněpropagovat, dokud nenínalezen uzel mající aspoň n/2 položek V krajním případěse zlikviduje celý strom a zbude samotný kořen neobsahující žádnou položku (prázdný index) Přístup k datům 27 Přístup k datům 28
Úprava B + -stromu: příklad výmazu B+-strom před a po zrušení záznamu s klíčem A-357 Indexy s B-stromy B-stromy jsou podobné B+-stromům, avšak hodnoty klíčů se neopakují eliminace redundantního ukládání klíčů Hodnoty klíče, kterése nacházejív nelistových uzlech, užse nevyskytují nikde níže v podstromech V nelistových uzlech je však nutno přidat další ukazatele Výhody B-stromových indexů: Mohou potřebovat méně uzlů než odpovídající B+-strom Občas lze najít záznam bez nutnosti projít aždo listu Nevýhody B-stromových indexů: Položky nelistových uzlů jsou větší, takže uzel má méně následníků, což může způsobit nutnost větší hloubky stromu Aktualizace při vkládánía mazánízáznamůjsou komplikovanější než u B+-stromů Typicky, výhody B-stromů nepřevažují nad nevýhodami Přístup k datům 29 Přístup k datům 30 Příklad indexu s B-stromem Bromfield Palo Alto B-strom pro soubor s relací account (n=3) Přístup k datům 31 Přístup přes několik klíčů Příklad: select account_number from account where branch_name = Benešov and balance = 1000 Možné strategie s použitím klíčů dle jednotlivých atributů 1. Použij index pro branch_namea najdi záznamy pro "Benešov"; pak testuj na balance = 1000 2. Použij index pro balance k nalezení účtů se zůstatkem 1000; pak testuj branch_name = "Benešov". 3. Použij index pro branch_name k nalezeníukazatelůna záznamy z benešovsképobočky. Podobněpoužij index pro balance. Závěrem urči průnik obou množin získaných ukazatelů Indexy podle vícenásobných klíčů Složenéprohledávacíklíčejsou klíče tvořenévíce nežjedním atributem Např. (branch_name, balance) U složených klíčů je problém s porovnáváním a řazením Nejčastějšíje lexikografickéřazení: (a 1, a 2 ) < (b 1, b 2 ), pokud a 1 < b 1, nebo a 1 = b 1 a a 2 < b 2 Přístup k datům 32
Hašování Statické hašování Sekce(bucket= kýbl, koreček)je paměťovájednotka obsahující jeden či několik záznamů typicky je to jeden alokačníblok diskového souboru Při hašovanéorganizaci souboruzískáme číslo sekce obsahující záznam s daným klíčem přímo jako funkční hodnotu hašovací funkce Hašovacífunkce hje funkcínad množinou hodnot prohledávacího klíče B = h(k), kde kje hodnota klíče a Bje adresa (číslo) sekce Hašovacífunkce se užívák lokalizaci záznamůpři vyvolávání, vkládání i mazání záznamů Záznamy s různými klíči mohou být hašovací funkcí mapovány do téže sekce, kteráse pak musíprohledávat sekvenčně Přístup k datům 33 Přístup k datům 34 Příklad hašované organizace souboru Soubor account s klíčem branch_name Máme10 sekcí Binární reprezentace znaku je chápána jako celé číslo Hašovací funkce vrací jako svoji funkční hodnotu součet binárních reprezentací znaků modulo 10 Např. h(perryridge) = 5 h(roundhill) = 3 h(brighton) = 3 Hašovací funkce Nejhoršíhašovacífunkce mapuje všechny hodnoty klíče do téže sekce nemá žádný přínos vše se prohledává sekvenčně Ideální hašovací funkce rozděluje klíče rovnoměrně Všem sekcím je přiřazen stejný počet záznamůpro všechny možné hodnoty klíče Ideální hašovací funkce by měla být náhodná, protože každá sekce máobsahovat přibližněstejný počet záznamůbez ohledu na aktuální rozložení hodnot klíče v souboru Náhodnáfunkce je však nereprodukovatelnáa tedy nepoužitelná Typické hašovací funkce počítají s vnitřní binární reprezentací klíčů Viz předchozí příklad Přístup k datům 35 Přístup k datům 36
Přeplnění sekcí Přeplnění sekcí vzniká kvůli nedostatečnému počtu sekcí nerovnoměrnosti v distribuci záznamů. To má dva důvody: více záznamů má stejné hodnoty klíče zvolená hašovací funkce nerovnoměrně mapuje klíče Přeplnění sekcí lze redukovat, nikoliv eliminovat Řeší se pomocí sekcí přeplnění Je-li zapotřebí více sekcí, Sekce sekce přeplnění dané hlavní 0 sekce jsou zřetězeny Sekce 1 Sekce 2 Sekce přeplněnísekce 1 Nedostatky statického hašování Statickáhašovacífunkce hmapuje hodnoty klíče do pevnémnožiny čísel (adres) sekcí. Databáze v čase rostou nebo se zmenšují Kdyžje na počátku zvolen malý počet sekcía soubor roste, účinnost rychle klesne kvůli velkému množství přeplnění Je-li alokován velký prostor s ohledem na očekávaný růst, mrhá se kapacitou paměti a sekce jsou nevyužité Když se databáze zmenší, opět se bude plýtvat prostorem Potenciálnělze čas od času soubor reorganizovat za použití jiné hašovací funkce Nákladné a narušuje normální operace s databází po dobu reorganizace nelze k datům přistupovat Lepšířešení: počet sekcíse bude měnit dynamicky podle potřeby Sekce 3 Přístup k datům 37 Přístup k datům 38 Dynamické hašování Vhodnépro databázovésoubory, jejichžvelikost se výrazně mění Umožňuje dynamickou modifikaci hašovací funkce Rozšiřitelné(extendible)hašování jedna z forem dynamického hašování Hašovacífunkce generuje hodnoty ve velkém rozsahu typicky b-bitová celá čísla (uvažujme b = 32) Pouze několik bitůzleva (prefix) se používájako index do tabulky s čísly (adresami) sekcí Nechťdélka prefixu je ibitů, 0 i 32. Tabulka adres sekcímádélku = 2 i. Na počátku i= 0 Hodnota i roste a klesá podle velikosti databázového souboru Několik položek v tabulce adres může ukazovat na tutéž sekci Tudížskutečný počet sekcíje < 2 i Počet sekcí se též dynamicky mění v důsledku spojování či rozdělování sekcí Obecná struktura rozšiřitelného hašování hašovací prefix 00... 01... 10... 11... i tabulka adres sekcí i 1 i 2 i 3 sekce 1 sekce 2 sekce 3 j-tápoložka tabulky adres sekcíobsahuje hodnotu i j Všechny položky tabulky ukazující na tutéž sekci mají shodných prvních i j bitů K nalezenísekce obsahujícízáznam s daným klíčem K j je třeba Určit X= h(k j ) a použít prvních ibitů Xjako index do tabulky adres sekcí a následovat ukazatel na příslušnou sekci Přístup k datům 39 Přístup k datům 40
Užití rozšiřitelného hašování vkládání Při vkládánízáznamu s klíčem K j Najdi sekci j, kam mázáznam přijít Je-li tam místo, vložzáznam; jinak sekce musíbýt rozdělena a vložení se opakuje Rozdělenísekce jpři vkládánízáznamu s klíčem K j : Pokud i> i j (více nežjeden ukazatel na sekci j) alokuj novou sekci za nastav i j = i z = (i j + 1) Aktualizuj druhou část položky v tabulce adres sekcí, původně ukazující na jtak, aby ukazovala na z vyjmi záznamy ze sekce j a vložje zpět (do jnebo z) urči znovu adresu sekce pro K j a vložzáznam Když i = i j (jen jeden ukazatel na sekci j) Inkrementuj i a zdvojnásob velikost tabulky adres sekcí Nahraď každou položku v tabulce dvěma položkami ukazujícími na tutéž sekci Nyní i > i j, takže se užije předchozípřístup Rozšiřitelné hašování jednoduchý příklad Kapacita sekce = 1 záznam Prvnídva záznamy s klíči k 1 a k 2 h(k1 ) = 100100 h(k 2 ) = 010110 Třetízáznam s k 3 dává h(k 3 ) = 110110 Záznam4 s k 4 má h(k 4 ) = 011110, cožzpůsobí, že se sekce A přeplní a musí být rozdělena na A a D. Pokus o znovu-vložení záznamu s k 4 do D způsobíopět přeplněnía D se dále dělína D a E za současného přidánídalšího bitu k prefixu délka prefixu= 1 délka prefixu = 2 tabulka adres sekcí 0 1 00 01 10 11 délka prefixu = 3 000 001 010 011 100 101 110 111 sekcea sklíčem k 2 sekceb s klíčemk 1 sekce A s klíčem k 2 sekce B s klíčem k 1 sekce C s klíčem k 3 sekce A bez klíče sekce B s klíčem k 1 sekce C s klíčem k 3 sekce D s klíčem k 2 sekce E s klíčem k 4 sekce A může být zrušena Přístup k datům 41 Přístup k datům 42 Užití rozšiřitelného hašování výmaz Výmaz záznamu s daným klíčem najdi záznam v sekci a vymažho Je-li sekce prázdná, zrušji (za současnéaktualizace tabulky adres) Sekce mohou být spojeny v jednu Lze spojit jen sekce majícístejné i j asoučasněexistuje prefix i j 1 Lze též zmenšit tabulku adres sekcí Je to ale náročnáa draháoperace a másmysl ji dělat jen kdyžse počet sekcívýraznězmenšíanebo narážíme na problémy s kapacitou paměťového média Porovnání indexace a hašování Jednoznačnévýhody nejsou u žádného ze způsobů. Vše závisína ceně periodické reorganizace souborů a indexů relativní frekvenci vkládání a rušení záznamů Je důležitéoptimalizovat průměrnou dobu přístupu i za cenu podstatného prodloužení přístupové doby v nejhorším případě? Očekávané typy dotazů: Hašováníje obecnělepšípři vyvolávánízáznamůs přesnou hodnotou klíče Jsou-li častédotazy na interval hodnot klíče, pak indexace je výhodnější Praxe: PostgreSQL podporuje hašované indexy, avšak jejich použití se nedoporučuje kvůli špatné efektivitě Oracle podporuje statické hašování, ale ne hašované indexy Microsoft SQLServer podporuje jen B+ stromy... Přístup k datům 43 Přístup k datům 44
Dotazy Přístup k datům 45