Relaatiomalliin perustuvissa tietokannoissa on standardiksi käyttöliittymäksi vakiintunut SQL-kieli SQL-kielen perustana on rivikalkyyliin mukainen kyselymalli, jota on täydennetty laajennetun relaatioalgebran operaatioilla. Perinteisesti SQL-tietokantojen taulut ovat rivin toistumismahdollisuutta lukuun ottamatta noudattaneet relaatiomallin rakenneperiaatteita (rivit, sarakkeet, sarakkeissa atomiset rakenteettomat arvot). Uusimman SQL-standardin myötä atomisten rakenteettomien arvojen vaatimuksesta on kuitenkin luovuttu tätä käsitellään tarkemmin myöhemmin kurssilla. Perusperiaate kannankäsittelyssä on sama kuin relaatioalgebrassa ja kalkyyleissä: kysely tuottaa tuloksenaan aina joukon rivejä. Perinteisissä proseduraalisissa ohjelmointi-kielissä käsittelyn kohteena on yksi tietoelementti kerrallaan. Kun tällaista ohjelmointikieltä käytetään tietokannan käsittelyyn, pitää kyselyn tulosrivien joukko käydä läpi ohjelmasilmukassa. Tähän tarkoitukseen on erilaisia ohjelmointiliittymiä esikääntäjän käyttöön perustuva upotettu SQL (embedded SQL) tai rajapintakirjastot SQL-API (appliction programming interface) esim, ODBC, JDBC tai järjestelmäkohtaiset CLI (call level interface) -kirjastot 1 2 Jokaisen kyselyn suoritukseen liittyy runsaasti erilaista oheistoimintaa varsinaisen suorituksen lisäksi, esim: kyselyn kääntäminen suoritussuunnitelman laadinta suoritusoikeuden tarkistus samanaikaisuuden hallintatoimet transaktion hallinta muistitilan hallinta tietoliikenteen hallinta Oheistoimien yhteydessä voidaan suorittaa runsaasti tietokantaoperaatioita haetaan kuvaustietoa (taulujen rakenteesta, käyttöoikeuksista, tilastoja taulujen sisällöstä) kirjoitetaan hallintatietoa (resurssien käytöstä, suorituksen etenemisestä, peruutuksiin varautumisesta) Pienien kyselyjen kohdalla oheistoimintojen kustannukset (suoritusaika, resurssitarve) saattavat ylittää selvästi varsinaisen kyselyyn vastaamisen kustannuksen. 3 4 Relaatiotietokantojen kohdalla ns. ohjelmanavigointiin perustuva käsittely voi olla kokonaisuuden kannalta hyvin tehotonta hae tason 1 kohteet; käy läpi tason 1 kohteet { // m riviä hae liittyvät tason 2 kohteet; käy läpi tason 2 kohteet { // n riviä hae liittyvät tason 3 kohteet; käy läpi tason 3 kohteet {. } } Tehottomuuden syitä: Sisin kysely suoritetaan usein. Sen oheistoimintojen osuus voi olla määräävin koko ohjelman kustannuksissa. Pakotetaan järjestelmä suorittamaan operaatioita, joihin ei ehkä päädyttäisi laajemman kyselyn suoritussuunnitelmaa laadittaessa niiden tehottomuuden takia. Ei pystytä hyödyntämään peräkkäishaun suhteellista nopeutta 5 6 Harri Laine 1
Vaihtoehtona on käyttää laajempia kyselyitä, antaa tkhj:n laatia toteutussuunnitelma, ja käyttää vähemmän sisäkkäisiä silmukoita Esim. haetaan kerralla kurssin nimi, harjoitusryhmän kokoontumispaikka, ja ryhmäläisten nimet eikä haeta ensin kurssin nimeä ja tunnusta, sitten kokoontumisaika ja ryhmätunnus ja viimeksi ryhmätunnuksen perusteella osallistujat Tämä ei suinkaan tarkoita sitä että sisäkkäisistä silmukoista pitäisi päästä kokonaan eroon mutta kannattaa miettiä DO NOT PRI NT THIS DOCUM E Seuraavassa tarkastellaan relaatiotietokantaan kohdistuvien operaatioiden toteutusta Tietokannat toteutetaan talennustasolla tiedostoina tarkastelun pohjaksi käsitellään tiedostojen toimintaperiaatteita ja tiedostorakenteita Seuraavaksi käsitellään relaatioalgebran operaatioiden toteutusta tiedosto-operaatioiden avulla sekä operaatioiden suorituksen kustannuksia 7 8 Tiedostoista Tiedostolla (file) tarkoitetaan tässä tallennustason tietokokoelmaa Loogisesti tiedosto jakautuu tietueiksi (record) Teknisesti tiedosto tallennetaan yhdelle tai useammalle yhtenäiselle muistialueelle (segment) nykyään tyypillisesti levymuistiin. Muistialue jakautuu sivuihin (page). Sivu on tkhj:n (tai kj:n) kannalta pienin osoitettavissa oleva ja kerralla apumuistin ja keskusmuistin välillä siirrettävä yksikkö tallennusmedian kannalta voi olla pienempiäkin käsittely-yksikköjä Tiedostoista Tietuetta voidaan käsitellä vain kun se on haettu keskusmuistiin ohjelman työtilaan Tietuetta ei haeta ohjelman työtilaan suoraan tiedostosta, vaan haku tapahtuu puskurin (buffer) kautta. Puskuri on sivun kokoinen muistialue ja tietueen sisältävä sivu on haettava levyltä puskuriin ennen kuin tietue voidaan siirtää ohjelman työtilaan. Kun tietue halutaan kirjoittaa tiedostoon, se viedään ensin puskurilla olevalle sivulle ja sen jälkeen sivu kirjoitetaan tiedostoon. 9 10 Tiedostoista Levyn rakenne Tiedoston käsittelyominaisuudet riippuvat tallennusmediasta. Jos tiedosto on keskusmuistissa ovat luku ja kirjoitusoperaatiot yhtä nopeita. Sivun lukemiseen/kirjoittamiseen kuluu aikaa n 10-50 ns Flash -muistilla sijaitsevan tiedoston sivun lukemisen aika on samaa kertaluokkaa kuin keskusmuistissa (hieman hitaampi) mutta kirjoittaminen vie 4000-10000ns. (flash on vain rajatusti uuskäyttöinen) Levytiedostossa sivun luku- ja kirjoitusoperaatioiden suoritusaika on keskenään samaa luokkaa, nykyään tyypillisesti 5-10 ms= 5,000,000-10,000,000 ns, mutta aika ei ole vakio vaan riippuu aiemmista toiminnoista. Levykössä (disk drive) on useita samankeskisiä levyjä (disk) Levyissä on magneettinen pinta (disk surface) kummallakin puolella levyä Levyllä on osoitettavissa olevia uria (track), muutamasta sadasta muutamaan tuhanteen, päällekkäiset urat muodostavat sylinterin (cylinder) Urat voivat jakautuvat sektoreihin (sector) 11 12 Harri Laine 2
Levykön rakenne Levyn rakenne pyöriviä levyjä Hakuvarsi ura lohko sektori luku-/kirjoituspää Lohko (=levyjakso, block) on yhdestä tai useammasta peräkkäisestä sektorista muodostuva alue uralla. Lohkokoko on yleensä 512 tavun monikerta (kakkosen potenssi). Lohkot erotetaan toisistaan lohkovälillä, johon talletetaan lohkoon liittyvää kontrollitietoa. jos sektorikoko on 512B ja lohkokoko 8KB muodostuu yksi lohko 16 peräkkäisestä sektorista Tietoa siirretään levyltä ja levylle aina kokonaisina lohkoina. lohkon fyysinen osoite muodostuu levypinnan numerosta, uran numerosta ja uran sisäisestä lohkon numerosta Aiemmin esillä ollut sivu on korkeamman tason abstraktio lohko käsitteestä, sivu tallennetaan peräkkäisiin lohkoihin 13 14 Levyn rakenne Lohkon sisällön hakemiseksi Siirretään luku/kirjoituspäät halutulle sylinterille (päät siirtyvät kullakin pinnalla samanaikaisesti yhdessä) Odotetaan, että haluttu lohko pyörähtää luku/kirjoituspään kohdalle (levyn pyörimisnopeus luokkaa 100 kierrosta sekunnissa) Aktivoidaan halutulla pinnalla oleva luku/kirjoituspää lukemaan dataa yleensä vain yksi pää voi olla samanaikaisesti aktiivinen I/O prosessori siirtää luetun datan hakupyynnön yhteydessä annettuun puskuriin 15 Hakuaika Levyltä hakemiseen kuluva aika (hakuaika, access time) muodostuu: hakuvarren siirtoajasta eli kohdistusajasta (seek time) (sylinterille siirtyminen) (st) aika riippuu siitä millä sylinterillä päät ovat alunperin, lyhyt siirtymä vie vähemmän aikaa, 0 levykohtainen maksimi. Usein ilmoitetaan keskimääräinen kohdistusaika esim. 6 ms pyörähdysviiveestä (rotational delay) (rd) riippuu alkuperäisestä kohdasta ja pyörimisnopeudesta. lohkon siirtoajasta (block transfer time) (btt) riippuu uran kapasiteetista, pyörimisnopeudesta ja lohkon koosta 16 Pyörähdysviive Jos levyn pyörimisnopeus on p kierrosta minuutissa (rpm), niin keskimääräinen pyörähdysviive rd= ½ *(1/p) min = ½*(60*1000/p) ms Jos p=10000, niin rd=3 ms (tyypillinen) Jos p=6000, niin rd= 5 ms 17 Lohkon siirtoaika Lohkon siirtoaika (= aika, joka kuluu siihen, että lukupää kulkee lohkon sektoreiden yli = täyden kierroksen pyörähdysaika kerrottuna lohkon koon suhteella uran kapasiteettiin Esimerkki: Olkoon lohkokoko 4KB, uralle mahtukoon 50 lohkoa, joten uran kapasiteetti on 200KB. Olkoon kierrosnopeus 6000 rpm eli 100 kierrosta sekunnissa. Tällöin siirtonopeus (transfer rate, tr) =100*200 KB/s =20 KB/ms ja lohkon siirtoaika = lohkokoko/siirtonopeus= 0.2 ms 18 Harri Laine 3
Hakuaika Mitä lähempänä (oikeaan suuntaan) nykyistä kohtaa seuraava haettava lohko on sitä nopeampaa on haku, nopeasta hitaaseen seuraavana samalla uralla samalla sylinterillä seuraavana ei pyörähdysviivettä jossain samalla uralla tai sylinterillä läheisellä sylinterillä kaukaisella sylinterillä Peräkkäisten saman uran ja sylinterin lohkojen siirtäminen on tehokkainta, koska tällöin ei tule hakuvarren siirtoa eikä pyörähdysviivettä. Hakuaika Olkoon st= kohdistusaika rd= pyörähdysviive btt= lohkon siirtoaika= kierrosaika/uran lohkojen lukumäärä. Sivun hakuaika = sd+rd+i*btt i= sivun tallettamiseen tarvittavien lohkojen lukumäärä kohdistusaika ja pyörähdysviive vaihtelevat, arvioissa käytetään usein keskimääräistä aikaa Sivupyynnön toteutuksen palveluaikaan on vielä lisättävä levyohjaimen jonotusaika sillä levyohjain voi suorittaa vain yhtä pyyntöä kerrallaan jonotusaikaan vaikuttaa kaikki levylle kohdistuva kuorma vaikeasti arvioitavissa 19 20 Usean lohkon hakuaika Levytiedoston käsittely Haettaesa k lohkoa, lohkojen yhteenlaskettu saantiaika on enintään k*(st+rd+btt), jos lohkot sijaitsevat satunnaisesti levyllä sd+k*(rd+btt), jos lohkot sijaitsevat satunnaisesti samalla sylinterillä ja minimissään sd+ rd+k*btt, jos lohkot ovat peräkkäin samalla sylinterillä Kaavojen tekijöistä sd ja rd ovat samaa millisekunneissa mitattavaa kokoluokkaa ja btt noin kymmes- sadasosa niistä (millisekunnin osia) Jos sd=5ms, rd=5ms ja btt=0.2 ms, k=1000 niin kokonaissaantiajan vaihteluväli olisi 0.21s - 10.2s 21 Tiedostot sijoitetaan levylle yhdelle tai useammalle peräkkäisistä lohkoista koostuvalle alueelle voidaan hyödyntää peräkkäiskäsittelyn nopeutta koko tiedoston lukemisessa puskurien hallinnassa voidaan käyttää ns. ennakoivaa hakua (pre-fetch) haetaan valmiiksi puskureihin järjestyksessä seuraavia sivuja vaikka niitä ei ole vielä pyydetty 22 Tietojen tallennusrakenteet Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa tiedot tiedostoon kuuluvista lohkoista esim. taulukkona, joka voi muodostua ketjutetuista osista tietoja tietueiden rakenteesta muuta hallintatietoa Tietojen tallennusrakenteet Tiedoston sivut sisältävät ainakin: sivuotsakkeen sivun hallintaan tarvittavaa tietoa tietuealueen varsinaiset tietueet ja vapaa tila tietuehakemiston tietueiden sijaintitiedot sivulla 23 24 Harri Laine 4
Tietojen tallennusrakenteet Sivun alussa sijaitseva sivuotsake (page header) sisältää sivutunnisteeen (page identifier yleensä sivun järjestysnumero tiedostossa, on tiedostokuvaajan perusteella muunnettavissa fyysiseksi levyosoitteeksi tietuehakemiston alkioiden lukumäärän vapaan tilan hallintaan liittyvää tietoa mahdollisesti sivun tyypin tiedon siitä mihin tiedostoon sivu kuuluu (sisäinen tunniste) mahdollisesti linkkejä muille sivuille (esim. jatkosivun tunniste) käyttötietoa Sivun rakenne tyypillisesti Sivuotsake (sivu 123), 4 tietuetta tietue 1 tietue 2 tietueiden tila ja tietuehakemisto kasvavat vastakkaisiin suuntiin tietue 3 vapaata tilaa tietue 4 h4 h3 h2 h1 tietuehakemisto node id, file_id, page_no, record_index, address 25 26 Sivun rakenne Tietueiden talletusalue alkaa heti sivuotsakkeen jälkeen Tietuehakemisto on taulukko, jossa on kunkin sivulle talletetun tietueen alkukohta Tietueen talletukseen käytetty tila ja tietuehakemistolle varattu tila kasvavat vastakkaisiin suuntiin. Sivun rakenne Tietueen tunnisteen (record identifier, RID) muodostaa pari sivutunniste tietueen indeksi (tietuehakemistossa) Tuple identifier (TID) = record identifier 27 28 Samassa tiedostossa olevat tietueet voivat olla keskenään saman pituisia, eli kiinteäpituisia (fixed length) vaihtuvapituisia (variable length) erityyppisiä esim. kurssitietueita ja osallistujatietueita saman tyyppisiä, mutta tietokenttien pituus tai määrä vaihtelee tietueessa voi olla kiinteäpituisia tai vaihtuvapituisia kenttiä, yksikin vaihtuvapituinen kenttä tekee tietueesta vaihtuvapituisen Kiinteäpituinen kenttä on jokaisessa tietueessa saman pituinen smallint, integer, float, double, date ja timestamp tyyppiset arvot tallennetaan tyypillisesti (ei kuitenkaan välttämättä) kiinteäpituisiin kenttiin kentän pituus riippuu tietotyypistä. Esimerkiksi kokonaisluvut voitaisiin tallentaa binäärisinä 4 tavun pituisina kenttinä SQL:n tietotyyppi char määrittelee kiinteänpituisen merkkijonon. Sillekin kiinteäpituinen kenttä soveltuisi 29 30 Harri Laine 5
Vaihtuvapituisia kenttiä käytetään tyypillisesti tilanteissa, joissa tietoalkioiden arvot vaihtelevat merkittävästi pituudeltaan Esimerkiksi vaihtuvapituiset merkkijonot Yleensä vaihtuvapituisilla kentillä pyritään säästämään tilaa, mutta tilansäästöä voidaan saada muutenkin, esimerkiksi tiivistämällä tietueet Relaation employee(name, ssn, salary, address) monikon ( Smith, John, 010263-189F, 17000, Park Avenue... ) esittäminen: kiinteänmittaisilla kentillä (alkukohta laskettavissa kun tiedetään kenttien pituudet): tyhjä tavu 20 tavua 11 tavua 4 tavua 30 tavua Smith, John 010263-189F 17000 Park Avenue 0 20 34 38 31 32 Vaihtuvanmittaiselle kentälle erilaisia esitystapoja: erotinmerkkien avulla siirtymätaulukon avulla 4 Smith, John $ 010263-189F $ 17000 $ Park Avenue $ 4 5 16 27 32 Smith, John 010263-189F 17000 Park Avenue 1 13 24 30 1 1 5 16 27 32 pituuskentän avulla yksi tavu 4 11 Smith, John 11 010263-189F 5 17000 25 Park Avenue 1 2 1 14 25 31 kenttien lukumäärä 33 34 Usein tietueissa on sekä kiinteän että vaihtuvan pituisia osia, tällöin kiinteänmittaiset ovat yleensä tietueen alussa kiinteissä paikoissa vaihtuvanmittaisen osan alkukohta samoin kenttien järjestys (vähintään ) on kuvattava esim. sivun otsikkotietueessa Isokokoiset tiedot, kuten kuvat, tallennetaan usein eri tiedostoon kuin muu taulun data, ja datatietueeseen viedään vain osoitin Oraclen tietuerakenteessa kaikki kentät ovat periaatteessa vaihtuvapituisia/valinnaisia Kentät esiintyvät tietueessa siinä järjestyksessä, missä ne on esitelty create table -lauseessa (myöhemmät lisäykset tietueen loppuun). Kunkin kentän alussa on pituus 1-3 tavuna alle 250 pituisten pituus ilmaistaan yhdellä tavulla ja yli 250 kolmella tavulla, ensimmäisen pituustavun arvo 255 kertoo, että 2 seuraavaa sisältävät pituuden Jos kenttä on tyhjä (null), niin pituus on 0. Oracle tietueessa on lisäksi alussa otsakeosa (version 8.0 laskukaavojen mukaan 3 tavua) 35 36 Harri Laine 6
Tyypillinen relaatiotietokannan toteutustapa on tallentaa kukin taulu omaan tiedostoonsa. Joissain järjestelmissä, esim. Oraclessa on mahdollista limittää yhteenkuuluvia tietoja eri tauluista samaan tiedoston Tiedostojen tehokkuutta yhtä kyselyä kohti arvioidaan usein tarvittavien sivuhakujen määrällä kuten levykäsittelyn yhteydessä todettiin hakuja on kahden tyyppisiä satunnaishakuja ja peräkkäishakuja 37 38 Kokonaistehokkuuteen vaikuttaa myös puskureiden määrä oikean levyhaun tarpeen todennäköisyys vähenee puskureiden määrän kasvaessa, koska todennäköisyys sille, että tarvittava sivu on jo puskurissa kasvaa Levyjen ominaisuudet ja verkkoyhteyksien nopeus vaikuttavat kokonaistehokkuuteen. Levyhakujen määrä on yksinkertainen ja selkeä tehokkuusmitta: ei riipu laitteistosta riippuu tiedostorakenteesta arvioinnissa voi käyttää keskiarvoja, maksimia, jne. vrt. tietorakenteiden analyysi Tiedostorakenteen tasolla vaikuttavia tekijöitä ovat tietueiden järjestys tietueiden sijainti suhteessa toisiinsa miten tietueita kytketään tiedoston sisällä tiedostojen välillä käytetäänkö suoria osoitepohjaisia kytkentöjä vaiko relaatiokantojen avainperustaisia epäsuoria kytkentöjä 39 40 tarjoavat tiedostojen käsittelyyn varsinaisten datatietueiden sijoittelun lisäksi erilaisia apurakenteita (indeksejä), joilla pyritään nopeuttamaan käsittelyä Relaatiotietokantojen avainperusteiset viiteavainkytkennät vaativat apurakenteita toimiakseen tehokkaasti Apurakenteet vaativat levytilaa, puskuritilaa, omia ylläpitotoimia lisäysten ja muutosten yhteydessä Apurakenteiden käyttömahdollisuudet riippuvat datatietueille valitusta organisaatiosta indeksi 1 indeksi n perusrakenne = varsinaisten datatietueiden tiedosto Apurakenteina indeksit tarjoavat tehokkaita saantipolkuja datatietueisiin Indeksien ylläpito aiheuttaa kustannuksia 41 42 Harri Laine 7