Hajautusrakenteet R&G Chapter 11 16.02.06 Tietokannan hallinta, kevät 2006, Jan 1
Hajautukseen perustuvat tiedostorakenteet Hajautukseen perustuvissa tiedostorakenteissa on tavoitteena yksittäisen tietueen nopea haku. Tähän pyritään siten, että tietueen sijoituspaikan eli solun (cell, bucket) osoite lasketaan jonkin tietueessa olevan tiedon eli hajautusavaimen (hash key) perusteella. Parhaassa tapauksessa solu olisi tietty tiedoston lohko. Yleensä solu kuitenkin muodostuu useasta lohkosta. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 2
Hajautukseen perustuvat tiedostorakenteet Solun osoitteena on joko kotilohkon osoite (tällöin ei käytetä soluhakemistoa) tai soluhakemiston indeksi soluhakemisto on taulukko, jonka alkioina on kotilohkojen osoitteita Mahdolliset soluosoitteet muodostavat osoiteavaruuden (address space) soluhakemistoa käytettäessä saadaan pienellä lisätilalla kasvatettua osoiteavaruutta moninkertaiseksi. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 3
Hajautukseen perustuvat tiedostorakenteet Osoitteen laskentaan käytetään hajautusfunktiota (hajautinta) (hash function, randomizing function). Olkoon h(x) hajautus funktio ja R K tietue, jonka hajautusavain on K. Tällöin R K :n sijoitussolun osoite = h(k). Solujen sisällä tietueet sijoitetaan kasarakenteen tapaan eli lisäykset loppuun. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 4
Hajautukseen perustuvat tiedostorakenteet Optimitapauksessa tietue löytyy yhdellä levyhaulla eli solun kotilohkosta*. Tämä edellyttää, että hajautusfunktio jakaa tietueet tasaisesti osoiteavaruuden osoitteisiin osoiteavaruus on määritelty riittävän isoksi niin, että kaikki tietueet voidaan sijoittaa solujen kotilohkoihin * soluhakemistoa käytettäessä joudutaan satunnaisesti hakemaan myös soluhakemiston sivuja 16.02.06 Tietokannan hallinta, kevät 2006, Jan 5
Hajautukseen perustuvat tiedostorakenteet Haku avaimella K: lasketaan hajautusfuktiolla solun osoite s=h(k) jos käytössä on soluhakemisto haetaan kotilohkon osoite sieltä p=h[s] muuten käytetään kotilohkon osoitteena solun osoitetta p=s. haetaan sivu lohkosta s ellei tietuetta löydy käydään läpi solun muut lohkot Jos hajautusavain ei ole tietueen avain on haussa käytävä läpi kaikki solun sivut. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 6
Hajautukseen perustuvat tiedostorakenteet Hajautusfunktio on tyypillisesti muotoa h(k) = int(k) mod B missä int(k) muuntaa hajautusavaimen kokonaisluvuksi Hyvältä hajautusfunktiolta edellytetään, että se jakaa hajautusavaimen arvot tasaisesti osoiteavaruuteen laskennan nopeus ei ole yhtä oleellista kuin keskusmuistihajautuksessa Hajautukseen perustuvat rakenteet nopeuttavat hakua vain kyselyissä, joissa tietueita haetaan hajautusavaimeen perustuvan yhtäsuuruusehdon avulla. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 7
Hajautukseen perustuvat tiedostorakenteet Oletetaan, että tiedosto mahtuisi kasarakenteena N sivulle ja hajautusavaimella olisi k erilaista arvoa. Olkoon osoiteavaruus 0,..B 1 Tällöin tulisi valita B<=k (muuten varataan tilaa soluille, jotka välttämättä jäävät tyhjiksi), Vain, jos B>=N, voidaan päästä yhteen levyhakuun tietuetta haettaessa B:n kokoon vaikuttavat mm. hajautusfunktio hajautusavaimen rakenne käytetäänkö soluhakemistoa, jolloin osoiteavaruuden koon kasvattaminen on kevyempää 16.02.06 Tietokannan hallinta, kevät 2006, Jan 8
Hajautukseen perustuvat A) Solun osoite on soluhakemiston indeksi tiedostorakenteet (11) (19) soluhakemiston sivu lohko x solu 11 solu 19 Tyhjille soluille varataan tilaa vain soluhakemiston alkion verran Soluhakemisto on haettava erikseen Yleisimmin käytetty ratkaisu 16.02.06 Tietokannan hallinta, kevät 2006, Jan 9 Lohkot käyttävissä koti tai ylivuotolohkoiksi
Hajautukseen perustuvat tiedostorakenteet B) Solun osoitteena on kotilohkon osoite (11) Talletukseen varattu perustila kotilohkot Tyhjätkin solut varaavat tilaa yhden lohkon verran Ylivuotolohkoille oma alueensa 16.02.06 Tietokannan hallinta, kevät 2006, Jan 10
Staattinen hajautus Perussolmujen lukumäärä kiinteä, varataan peräkkäin, soluja ei vapauteta; ylivuotosoluja tarpeen mukaan. h(k) mod M = solu mihin avaimen k omaava tietue kuuluu. (M = solujen lkm). h(k) mod M avain h 0 2 Pääsolut M 1 Ylivuotosivut 16.02.06 Tietokannan hallinta, kevät 2006, Jan 11
Dynaamiset hajautusratkaisut Aiemmin käsitelty hajautusrakenne perustui siihen, että tietueelle laskettiin soluosoite hajautusavaimen perusteella. Hajautusfunktio oli kiinteä ja sen arvoalue (osoiteavaruus) piti kiinnittää funktiota määriteltäessä. Tällöin ei välttämättä ole riittävää tietoa siitä, miten hajautusfunktio jakaa tietueet todellisessa käyttötilanteessa eikä välttämättä edes tietoa siitä, miten nopeasti tietueiden määrä kasvaa. Solua laajentavan ylivuotoketjun pituutta ei voida hallita ja ainakin alussa täytyy varata tilaa paljon yli todellisen tarpeen. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 12
Dynaamiset hajautusratkaisut B+ puussa hakupolun pituus pidetään hallinnassa puolittamalla sivu ja pitämällä kummatkin puolikkaat samanmittaisen hakupolun päässä. Sivun puolituksen ideaa sovelletaan myös dynaamisissa hajautusrakenteissa. Tunnetuimpia näistä ovat laajeneva hajautus (extendible hashing) ja lineaarinen hajautus (linear hashing) 16.02.06 Tietokannan hallinta, kevät 2006, Jan 13
Laajeneva hajautus Soluille varattu tila tulee täyteen. Miksi ei organisoida tiedostoa siten että tila tuplaantuu? Kaikkien sivujen lukeminen ja kirjoittaminen kallista! Ajatus: Käytetään osoitinhakemistoa soluihin. Tuplataan solujen määrä tuplaamalla hakemiston koko jakamalla täyteen tullut solu. Hakemisto on paljon pienempi kuin tiedosto joten sen lukeminen ja kirjoittaminen on edullisempaa. Vain yksi tietosolu joudutaan jakamaan. Ongelmana kuinka hajautusfunktiota muutetaan. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 14
Laajeneva hajautus Soluhakemiston koko on siis 2, 4, 8,. solua Olkoon rakenteen globaali syvyys d. Tällöin avaimen k solu (siis soluhakemiston indeksi) saadaan eristämällä hajautusfunktion antaman osoitteen lopusta d bitin pituinen osa tail_bits(h(k),d). Jos d=1 otetaan viimeinen bitti => {0,1} Jos d=2 otetaan 2 viimeistä bittiä => {00,01,10,11} 16.02.06 Tietokannan hallinta, kevät 2006, Jan 15
Laajeneva hajautus Lisäysten käsittely Jos soluhakemistosta löytyvässä kotilohkossa on tilaa tietue lisätään sinne kuten aiemmin käsitellyssä hajautuksessa Jos kotilohko (olkoon sen solutunnus binäärisenä {b}) on täynnä, otetaan käyttöön uusi lohko ja jaetaan ylivuotavan kotilohkon tietueet kotilohkon ja uuden lohkon välillä kotilohkolla on paikallinen syvyys (local depth) p (monenko bitin perusteella tietueet on sijoitettu lohkoon) 16.02.06 Tietokannan hallinta, kevät 2006, Jan 16
Laajeneva hajautus Lisäyksen käsittely jatkuu tietueille tehdään uusi sijoittelu ottamalla käyttöön hajauttimen tuottaman osoitteen lopusta päin p+1:s bitti ne tietueet, joilla tämä bitti on 0, jäävät kotilohkoon ja muut siirtyvät (oletetaan, että kaikki eivät menneet samaan lohkoon, näinkin voisi käydä ) kotilohkon ja uuden lohkon paikalliseksi syvyydeksi asetetaan p+1 soluhakemiston alkiot, joiden indeksin p+1 viimeistä bittiä ovat 1{b} asetetaan osoittamaan uuteen lohkoon 16.02.06 Tietokannan hallinta, kevät 2006, Jan 17
Esimerkki Soluhakemiston koko 4. Solun r löytämiseen, eristä globaalin syvyyden lukumäärä bittejä. Merkitään tätä h(r). Jos h(r) = 5 = binäärisenä 101, oikean solun osoite löytyy siis solusta 01. Paikallinen syvyys Globaali syvyys 00 01 10 11 2 Soluhakemisto 2 4* 12* 32* 16* 2 1* 5* 21* 13* 2 10* 2 15* 7* 19* tietohakemisto Solu A Solu B Solu C Solu D Lisäys: Jos solu on täynnä, halkaise se (varaa uusi sivu ja sijoita arvot uudestaan). 16.02.06 Tietokannan hallinta, kevät 2006, Jan 18
Lisätään h(r)=20 Paikallinen syvyys 2 Globaali syvyys 32*16* Solu A Paikallinen syvyys Globaali syvyys 3 32* 16* Solu A 00 01 10 11 2 2 Hakemisto 1* 5* 21*13* 2 10* 2 15* 7* 19* Solu B Solu C Solu D 111 2 3 4* 12* 20* Solu A2 Hakemisto (`uusi sivu ja puolet 4* 12* 20* Solu A2 solusta A) 16.02.06 Tietokannan hallinta, kevät 2006, Jan 19 000 001 010 011 100 101 110 3 2 1* 5* 21* 13* 2 10* 2 15* 7* 19* Solu B Solu C Solu D
Huomioita 20 = binäärisenä 10100. Viimeiset 2 bittiä (00) kertoo että r kuuluu soluun A tai A2. Viimeiset 3 bittiä kertoo kumpaan. Hakemiston globaali syvyys: Kuinka monta bittiä tarvitaan oikean solun etsimiseen. Solun paikallinen syvyys: kuinka monta bittiä tarvitaan selvittämään kuuluuko arvo tähän soluun. Milloin solun halkaisu aiheuttaa hakemiston kasvatuksen? Ennen lisäystä solun paikallinen syvyys = globaali syvyys ja lisäys aiheuttaa tilanteen, jossa solun paikallinen syvyys > globaali syvyys. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 20
Hakemiston kasvatus Miksi käytää vähiten merkitseviä bittejä? Sallii kasvatuksen kopioinnilla! 6 = 110 000 3 6 = 110 000 3 0 1 1 6* 00 01 10 11 001 2 010 011 1 00 100 0 10 6* 101 110 111 6* Vähiten merkitsevät vs. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 21 1 6* 01 11 100 2 010 110 001 6* 101 011 111 6* Eniten merkitsevät
Esimerkki 2: 1/4 000 001 010 011 100 101 110 111 3 globaali syvyys lisätään: 0010 1000 1001 0101 0011 0010 0001 0101 1110 1 3 3 2 täynnä 16.02.06 Tietokannan hallinta, kevät 2006, Jan 22
Esimerkki 2: 2/4 000 001 010 011 100 101 110 111 3 globaali syvyys lisätään: 0010 1000 1001 0101 0011 0010 0001 0101 1110 1 3 3 2 siirretään ne, joilla 2. viimeinen bitti on 1 16.02.06 Tietokannan hallinta, kevät 2006, Jan 23
Esimerkki 2: 3/4 000 001 010 011 100 101 110 111 3 globaali syvyys 1000 1001 0101 0011 0001 0101 2 3 3 2 0010 0010 1110 2 siirretään ne, joilla 2. viimeinen bitti on 1 vanhan ja uuden paikallinen syvyys 2 vaihdetaan ne soluosoittimet, joiden indeksi loppuu..10 osittamaan uuteen 16.02.06 Tietokannan hallinta, kevät 2006, Jan 24
Esimerkki 2: 4/4 000 001 010 011 100 101 110 111 3 globaali syvyys 1000 1001 0101 0011 0001 0101 2 3 3 2 0010 0010 1110 2 siirretään ne, joilla 2. viimeinen bitti on 1 vaihdetaan ne soluosoittimet, joiden indeksi loppuu..10 osittamaan uuteen 16.02.06 Tietokannan hallinta, kevät 2006, Jan 25
Laajeneva hajautus Rakenne laajenee sykäyksittäin Jos jakokohtaan osuvissa avaimissa on yhtenäinen bittisekvenssi, voidaan joutua tekemään monta jakoa ennen kuin tietueet saadaan jaettua Jos soluhakemisto kasvaa isoksi eikä sitä voida pitää keskusmuistissa voidaan hakuun tarvita 2 levyhakua Jako ja tuplaus voivat edellyttää useita hakuja. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 26
Lineaarinen hajautus Lineaarisessa hajautuksessa (kotimaista alkuperää Per Larsson) ei välttämättä tarvita soluhakemistoa. Hajautusaluetta laajennetaan solu kerrallaan jakamalla jakovuorossa olevan solun sisältö solun itsensä ja uuden solun kesken. Solut saavat jakovuoronsa järjestyksessä, eikä jaettava solu ole suinkaan välttämättä se jonka kohdalla ylivuoto tapahtuu soluihin voidaan ylivuotavia tietueita varten liittää ylivuotolista. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 27
Lineaarinen hajautus Solun osoitteen määräämiseksi käytössä on sarja hajauttimia h 0,h 1,h 2,... Nämä ovat muotoa h i = h(k) mod (2 i N). h i N voidaan valita kakkosen potenssiksi 2 d, tällöin h i eristäisi d+i bittiä perushajauttimen tuottaman arvon lopusta. jos d=5, niin h 0 eristää 5 bittiä, h 1 6 bittiä jne tietueen haussa tarvitaan perushajauttimen lisäksi kahta hajautinta h taso ja h taso+1 16.02.06 Tietokannan hallinta, kevät 2006, Jan 28
Lineaarinen hajautus Haku laske osoite h taso (h(k)), eli ota d+taso bittiä lopusta jos kyseessä on jakamaton solu, etsi tietuetta solusta. jos kyseessä on jaettu solu muodosta uusi osoite h taso+1 (h(k)), eli ota d+1+taso bittiä lopusta etsi tietuetta saadusta solusta Solu on jakamaton, jos sen indeksi on suurempi tai yhtä suuri kuin jakovuorossa olevan solun indeksi. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 29
Lineaarinen hajautus Olkoon d=1, taso=2, eli h 2 antaa osoitteet 0..7 ja h 3 osoitteet 0..15 jaettuja jakovuorossa jaon tuloksena syntyneitä seuraavan tason soluja 16.02.06 Tietokannan hallinta, kevät 2006, Jan 30
Lineaarinen hajautus Lisäyksessä, solmu lisätään haun määräämään lohkoon Jos solmu ei mahdu kotilohkoon, se lisätään ylivuotoketjuun. Ylivuoto käynnistää jako operaation. Olkoon jakovuorossa olevan solun taso+d bitistä muodostuva osoite {b}. Otetaan käyttöön uusi solu jonka osoite on 1{b}. jakovuorossa olevan solun tietueet jaetaan alkuperäisen soluun ja uuden solun kesken käyttäen hajautinta h taso+1. Jos jakovuorossa oli tason viimeinen solu siirtyy jakovuoro soluun 0 ja tasoa kasvatetaan yhdellä, muuten jakovuoro siirtyy seuraavaan soluun. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 31
Lineaarinen hajautus Olkoon d=1, taso=2, eli h 2 antaa osoitteet 0..7 ja h 3 osoitteet 0..15 jakovuorossa jaettuja jaon vastaanottajat 16.02.06 Tietokannan hallinta, kevät 2006, Jan 32
Lineaarinen hajautus Kullakin tasolla jaetaan vuorollaan jokainen tason solu. Kun kaikki on jaettu, on hajautusalue tuplautunut ja siirrytään seuraavalle tasolle. Rakenteessa voi olla pitkiäkin ylivuotoketjuja, mutta ne lyhenevät kun taso kasvaa. 16.02.06 Tietokannan hallinta, kevät 2006, Jan 33