Tiedostorakenteet Tiedostorakenne määrittelee miten tietueet tallennetaan tiedostoon miten tietoja haetaan Tiedostorakenne on yksitasoinen (flat), jos se muodostuu pelkästään datatietueista. Tiedostorakenne on monitasoinen, jos hakua tehostavat indeksit ovat välttämätön osa tiedostorakennetta. Jos indeksit eivät ole välttämättömiä tiedostorakenteen osia vaan erillisiä lisärakenteita, niitä kutsutaan oheisindekseiksi (oheishakemistoiksi, secondary index). Tiedostorakenteet Yksitasoisia talletusrakenteita käytetään lähinnä datatietueiden talletukseen: järjestämätön peräkkäisrakenne (kasa, heap) järjestetty peräkkäisrakenne (sequential file) hajautusrakenne 1 2 Järjestämättömässä peräkkäisrakenteessa (heap) tietueet sijoitetaan tiiviisti peräkkäisille sivuille lisäysjärjestyksessä Uusi tietue lisätään aina tiedoston loppuun. Jos tietue mahtuu tiedoston viimeiselle sivulle, se lisätään sinne, muuten otetaan käyttöön uusi sivu. Rakenne on useissa tkhj:ssä taulujen toteutuksen perusrakenne (datatietueiden talletusrakenne) Rakenne soveltuu hyvin peräkkäiskäsittelyyn, jossa tietueiden järjestyksellä ei ole merkitystä Taulun perustaminen create table lauseella luo tyhjän tiedoston yleensä tämä tarkoittaa yhtenäisen sivualueen varaamista tiedostolle, alueen koko voi olla järjestelmän päättämä tai siihen voi vaikuttaa esim. järjestelmäparametreilla tai create table lauseella Oraclen käyttää tästä alkuvarauksesta nimitystä initial extent ja sen koon voi määritellä taulukohtaisesti jos tiedosto kasvaa niin suureksi, ettei se enää mahdu alkuperäiselle sivualueelle otetaan käyttöön jatkoalueita. Tyypillisesti alueet kytketään ketjurakenteeksi (chain) 3 4 Tietueen lisäys järjestämättömään peräkkäistiedostoon on nopeaa. Haetaan tiedoston viimeinen sivu ja lisätään tietue sinne. Ellei tietue mahdu sivulle otetaan käyttöön seuraava sivu. Kuitenkin, jos tiedostolle on määritelty avain, vaatii avaimen yksikäsitteisyyden tarkastus pahimmassa tapauksessa koko tiedoston lukemisen (silloin kun avain on yksikäsitteinen) Yksittäisten tietueiden haku järjestämättömästä peräkkäisrakenteesta on sivuhakujen määrillä laskettaessa hidasta Jos tiedostossa on N sivua, vaatii tietueen haku avaimen perusteella keskimäärin N/2 levyhakua. Yleensä järjestämätöntä peräkkäisrakennetta ei käytetäkään yksinään, vaan sen ohella käytetään hakua tehostavia oheisindeksejä. Esimerkiksi Oraclessa taulun oletusarvoinen toteutusrakenne on järjestämätön peräkkäisrakenne, mutta avaimen määrittely luo sen oheen automaattisesti avainperustaisen oheisindeksin. 5 6 Harri Laine 1
Tietuejoukon haku jonkin muun kuin avaimeen perustuvan hakuehdon perusteella edellyttää koko tiedoston läpikäyntiä (N sivua) Vaikka sivuhakuja on runsaasti, rakenne voi silti toimia hyvin varsinkin suhteellisen pienillä tiedostoilla, sillä hauissa voidaan käyttää hyväksi sivujen peräkkäisyyttä (siirtoaika muodostuu merkittävimmäksi tekijäksi) Tietueiden muutokset voivat olla ongelma Jos tietuepituus kasvaa muutoksessa, tietue ei välttämättä enää mahdu kokonaisuudessaan sivulle muutoksen jälkeen Tyypillinen ratkaisu on käyttää jatkosivua, jonne tietueen ylivuotanut osa viedään. Perussivulle sijoitetaan jatkosivuun osoittava linkki. Koska jatkosivu ei kuitenkaan ole lähellä perussivua menetetään peräkkäishaun tuottama nopeusetu. Yleensä sivuille jätetään kasvuvaraa muutoksille esim. 20% riippuen siitä miten tietueiden ennakoidaan kasvavan. 7 8 Poistot helpompia hoitaa kuin muutokset. Poistettu tietue yleensä vain leimataan poistetuksi. Täyttöaste pienenee, jos poistoja on paljon Poistettujen tietueiden tila voidaan käyttää kasvuvarana muutoksissa Tarkastellaan taulua opiskelija. Oletetaan että taulussa on 8000 riviä. Tehdään kysely select * from opiskelija where opnro= 1234567 Joudutaan läpikäymään koko tiedosto ellei tiedetä, että opnro on avain ja keskimäärin puolet, jos se on määritelty avaimeksi ja löytyy (ensimmäinen osuma on ainoa) siis keskimäärin 4000 riviä 9 10 Olkoon levyn pyörimisnopeus on 100 kierrosta sekunnissa, sivukoko 4K tavua, uralla 50 sivua, levypintoja 12 sekä täyttösuhde 80%.Kohdistusaika keskimäärin 5ms. Yhden Opiskelija-tietueen keskipituus voisi olla 300 tavua. Sivulla olisi tällöin keskimäärin 10 tietuetta, uralla 500 ja sylinterillä 6000, eli tarvitaan 16 uraa (alle 2 sylinteriä) ja yhteensä 16 kierrosta koko tiedoston siirtämiseen. Oletetaan, että käytössä on riittävästi puskuritilaa, jotta luku voi edetä keskeytymättä. Koko tiedoston lukuun kuluisi tällöin kohdistusaika+pyörähdysviive+16*kierrosaika (+yksi lyhyt sylinterisiirtymä)= 5ms+5ms+16*10 ms(+10ms)=180 ms ja avainpohjaisessa haussa keskimäärin puolet tästä eli n. 90 ms (olettaen, että tietue löytyy) Sequential file Tietueet sijaitsevat tiedostossa jonkin kentän (esimerkiksi työntekijänumeron) mukaan järjestettyinä. Tietueiden järjestys on jokin tyypillisesti käsittelyssä usein tarvittava järjestys Rakenne tukee tietueiden käsittelyä peräkkäin halutussa järjestyksessä 11 12 Harri Laine 2
Lisäykset pitää järjestetyssä peräkkäisrakenteessa sijoittaa oikealle kohdalleen järjestyksessä. 10 20 30 40 50 60 70 80 90 100 45 Pahimmassa tapauksessa pitäisi siirtää koko tiedoston loppuosa uusiin paikkoihin Yleensä jätetään lisäyksille tilaa sivuille täyttösuhde jää alhaiseksi Jos sivulle tulee lisäys, joka ei mahdu sinne, otetaan käyttöön ylivuotosivu, joka linkitetään sivuun. Lisäysten kasautuessa ylivuotoketjusta voi tulla pitkä Rakenne degeneroituu nopeammin kuin järjestämätön Tarvitaan useammin uudelleenorganisointeja 13 Poistot ja muutokset tehdään kuten järjestämättömässä peräkkäisrakenteeseen. Tietueen haku tiedostosta järjestysavaimen perusteella vaatii tiedostoa läpilukemalla saman verran levyhakuja kuin kasarakenteessa, eli N/2, jos tietue löytyy. Löytymättömyys voidaan todeta keskimäärin samalla levyhakujen määrällä. Tässä suhteessa rakenne on parempi kuin järjestämätön. tukee myös järjestysavaimeen perustuvia arvovälihakuja sekä erisuuruusvertailuja <,<= 14 Järjestyksen määrääviä avaimia voi olla kuitenkin vain yksi (voi olla monen sarakkeen yhdistelmä). Muiden tietojen perusteella haettaessa rakenne käyttäytyy kuten järjestämätön peräkkäisrakenne. Rakenne mahdollistaa binäärihaun käytön Binäärihaun periaate: Etsi tietuetta tiedoston keskimmäiseltä (k=roof(n/2)) sivulta Jos ei löytynyt ja avain < sivun pienin avain, jatka samalla periaatteella sivuilta 1.. k-1. Jos ei löytynyt ja avain > sivun suurin avain, jatka samalla periaatteella sivuilta k+1.. N. Haku päättyy kun tietue löytyy tai tietuetta ei löydy sivulta mutta avain sijoittuu sivun pienimmän ja suurimman avaimen väliin (ei ole tiedostossa) tai etsintää pitäisi jatkaa tyhjästä sivujoukosta 15 16 Binäärihaussa tarvitaan enintään roof(log 2 N) levyhakua. (roof(x) = pienin kokonaisluku, joka on suurempi kuin x) Aiemman esimerkin 8000 Opiskelija-tietueen tiedostossa oli 800 sivua. Olkoon opiskelijanumero järjestysavain. Tietueen haku sen perusteella vaatisi enintään roof(log 2 800) = 10 levyhakua, joka satunnaishakuajalla laskettuna samalla n 10 ms satunnaishakuajan levyllä olisi hieman vähemmän kuin keskimääräinen saantiaika järjestämättömässä peräkkäisrakenteessa 5 ms +10*(5ms+0.2ms)=57ms (vs. peräkkäishaun 90 ms, jos löytyy, ja 180ms, jos ei löydy) Yllä kohdistusaika on laskettu vain kertaalleen, koska tiedosto mahtuu kahdelle vierekkäiselle sylinterille. Hakuvarren siirtoja kuitenkin tulee jonkin verran, joten käytännössä aika olisi hieman isompi ts ei oleellista eroa. Isommilla tiedostoilla binäärihaku parantaa asemaansa suhteessa koko tiedoston peräkkäiseen läpikäyntiin ei ole tyypillinen tietokantojen yhteydessä käytetty tiedostorakenne Vanhanaikaisissa eräsovelluksissa se oli laajasti käytetty soveltuu erityisen hyvin tilanteisiin, jossa pitää tahdistaa usean laajan aineiston käsittely 17 18 Harri Laine 3
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 sivu. Yleensä solu kuitenkin muodostuu useasta sivusta enintään yhdestä kotisivusta ja joukosta ylivuotosivuja (tai jatkosivuja) ylivuotosivut voivat olla solukohtaisia tai jaettuja Solun osoitteena on joko kotisivun osoite (tällöin ei käytetä soluhakemistoa) tai soluhakemiston indeksi soluhakemisto on taulukko, jonka alkioina on kotisivujen osoitteita Mahdolliset soluosoitteet muodostavat osoiteavaruuden (address space) soluhakemistoa käytettäessä saadaan pienellä lisätilalla kasvatettua osoiteavaruutta moninkertaiseksi 19 20 A) Solun osoite on soluhakemiston indeksi (11) (19) soluhakemiston sivu B) Solun osoitteena on kotisivun osoite (11) Talletukseen varattu perustila - kotisivut sivu x solu 19 Tyhjille soluille varataan tilaa vain soluhakemiston alkion verran Soluhakemisto on haettava erikseen Tyhjätkin solut varaavat tilaa yhden sivun verran Ylivuotosivuille oma alueensa solu 11 Yleisimmin käytetty ratkaisu Sivut käyttävissä koti- tai ylivuotosivuiksi 21 22 Osoitteen laskentaan käytetään hajautusfunktiota (hajautinta) (hash function, randomizing function) Olkoon h(x) hajautusfunktio ja R K tietue, jonka hajautusavain on K Tällöin R K :n sijoitussolun osoite = h(k). Solujen sisällä tietueet sijoitetaan järjestämättömän peräkkäisrakenteen tapaan eli lisäykset loppuun 23 Optimitapauksessa tietue löytyy yhdellä levyhaulla eli solun kotisivulta*. 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 kotisivuille. * soluhakemistoa käytettäessä joudutaan satunnaisesti hakemaan myös soluhakemiston sivuja 24 Harri Laine 4
Haku avaimella K: lasketaan hajautusfunktiolla solun osoite s=h(k) jos käytössä on soluhakemisto haetaan kotisivun osoite sieltä p=h[s] (jos hakemistoalkio on tyhjä, haku päättyy) muuten käytetään kotisivun osoitteena solun osoitetta p=s. haetaan sivu p ellei tietuetta löydy sivulta käydään läpi solun muut sivut Jos hajautusavain ei ole tietueen yksikäsitteinen avain on haussa käytävä läpi kaikki solun sivut. 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 sivuhakuun tietuetta haettaessa B:n kokoon vaikuttavat mm. hajautusfunktio hajautusavaimen rakenne käytetäänkö soluhakemistoa, jolloin osoiteavaruuden koon kasvattaminen on kevyempää 25 26 Hajautusfunktio on tyypillisesti muotoa h(k) = toint(k) mod B missä toint(k) muuntaa hajautusavaimen kokonaisluvuksi Hyvältä hajautusfunktiolta edellytetään, että se jakaa hajautusavaimen arvot tasaisesti osoiteavaruuteen laskennan nopeus ei ole yhtä oleellista kuin keskusmuistihajautuksessa Edellä on käsitelty ns. staattista hajautusta. Käytössä voi olla myös jokin dynaaminen hajautusmenetelmä. Näissä osoiteavaruus ei pysy vakiona, vaan kasvaa tiedoston kasvaessa. Hajautukseen perustuvat rakenteet nopeuttavat hakua vain kyselyissä, joissa tietueita haetaan hajautusavaimeen perustuvan yhtäsuuruusehdon avulla. 27 28 Harri Laine 5