Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Mitä tapahtuu tietokannassa?

Sivun loppuun

neau33 [09.04.2007 22:38:31]

#

Antti Laaksoselta kysyisin

Mitä tapahtuu kun tietokanta avataan ja tauluun päivitetaään yhden sarakkeen kenttään uusi tieto... Avataanko silloin jokin tiedosto, edelleen mitä luetaan muistiin ja mitä kirjoitetaan takaisin massamuistiin?

Blaze [09.04.2007 22:41:41]

#

neau33 kirjoitti:

Antti Laaksoselta kysyisin!

En ole Laaksonen, mutta vastaan silti >:)

neau33 kirjoitti:

Mitä tapahtuu kun tietokanta avataan ja tauluun päivitetaään yhden sarakkeen kenttään uusi tieto...

En oo koskaan minkään tietokantatuotteen toimintaan tutustunu, mut näin minä sen tekisin: kannan sisältö säilytetään toki ihan tavallisessa tiedostossa, mutta kannalla on tieto (indeksi) siitä, mistä kohasta tiedostoa mikäkin "rivi" alkaa, joten jos pyydetään kasvattamaan viidennen rivin kolmatta kenttää yhdellä, lukee kanta indeksistä viidennen rivin sijainnin varsinaisessa kantafilussa, fseek()aa kantafilua tuohon kohtaan, lukee siitä tarvittavan määrän bittejä, kasvattaa yhdellä, ja kirjoittaa samaan kohtaan takaisin.

(Hmm... voisin opetella käyttämään pisteitä pilkkujen sijasta ^__^;;)

Antti Laaksonen [09.04.2007 22:52:49]

#

Kehotan muita toimimaan Blazen tavoin, koska tietokantojen sisäinen toteutus ei todellakaan ole erikoisalani. Joka tapauksessa olen ymmärtänyt, että tietokantojen taustalla on melko monimutkaiset tietorakenteet, jotta eri toiminnot saataisiin nopeiksi ja luotettaviksi.

neau33 [09.04.2007 22:58:53]

#

Kiitos Blaze selventävästä vastauksesta!

Grez [09.04.2007 23:02:16]

#

Antti Laaksonen kirjoitti:

Kehotan muita toimimaan Blazen tavoin, koska tietokantojen sisäinen toteutus ei todellakaan ole erikoisalani.

Tietokantamoottoreita on useita erilaisia. Jotkut tietokannat tallentavat kaiken tiedon yhteen (tai käyttäjän niin halutessa muutamaan) tiedostoon ja sitten on sellaisia tietokantamoottoreita jotka esimerkiksi tallentavat kunkin taulun erilliseen tiedostoon tai muuten vaan tekevät tietyn määrän tiedostoja per tietokanta tai taulu.

Jos tietokanta on "mistään kotoisin" niin siinä on myös transaktiologi. Se on usein erillisessä tiedostossa.

Yleensä tietokantamoottori on ladannut useimmin tarvitut tiedot muistiin, joten niitä ei ladata joka kerta uudestaan. Kun käyttäjältä tulee pyyntö päivittää tietoa kannassa ja jos ko. tieto ei ole jo muistissa, niin tietokantamoottori lukee tiedostoja sen verran kuin on välttämtöntä että se pystyy paikantamaan oikean kohdan ja kirjoittaa ainoastaan muuttuneen kohdan takaisin levylle.

Kun tietokannassa on transaktiot käytössä se merkitsee myös transaktiologiin tiedot tästä muutoksesta. Mikäli se huomaa että esimerkiksi joku toinen käyttäjä pyrki tekemään vastaavaan paikkaan yhtä aikaa muutoksen ja tämän käyttäjän muutos jouduttiin sen vuoksi perumaan, se pystyy peruuttaman tapahtuman tietokannan eheyden takaamiseksi. Sinänsä transaktiot eivät ole niin merkityksellisiä jos tehdään aina vain yksi muutos. Mutta jos ajatellaan esimerkiksi pankin tilijärjestelmää jossa siirretään 100 euroa Matin tililtä Maijan tilille. Tällöin tietokantamoottorin tulee voida valmistamaan että joko molemmat tapahtumat suoritetaan tai sitten kumpaakaan tapahtumaa ei suoriteta. Lisäksi transaktiologin avulla voidaan kanta yleensä palauttaa mihin tahansa historialliseen tilanteeseen.

feenix [10.04.2007 16:57:12]

#

Blaze kirjoitti:

En oo koskaan minkään tietokantatuotteen toimintaan tutustunu, mut näin minä sen tekisin: kannan sisältö säilytetään toki ihan tavallisessa tiedostossa, mutta kannalla on tieto (indeksi) siitä, mistä kohasta tiedostoa mikäkin "rivi" alkaa, joten jos pyydetään kasvattamaan viidennen rivin kolmatta kenttää yhdellä, lukee kanta indeksistä viidennen rivin sijainnin varsinaisessa kantafilussa, fseek()aa kantafilua tuohon kohtaan, lukee siitä tarvittavan määrän bittejä, kasvattaa yhdellä, ja kirjoittaa samaan kohtaan takaisin.

Vain jos on yhden käyttäjän ei-transaktionaalinen kanta. Ja suurin osa ei moisia ole. Tai no, tietysti voi tehdä lukituksen tiedostolle jne mutta se on silloin myöskin yhden käyttäjän kanta.

(Yksinkertaistettu kuvaus selityksen takia)

Monesti kannassa on osoittimia tietueisiin (kuten sanoitkin) ja tietueissa voi olla osoittimia ihan muualle (esim. pitkät tekstit jne jotka saatetaan tallettaa erikseen). Kun arvoja muutetaan, monesti tehdään uusi tietue, talletetaan sinne tiedot ja siirretään osoitinta. Tällöin voidaan samanaikaisesti lukea vanhaa tietuetta niin paljon kuin huvittaa ja tieto on ehjää. Jos päivitetään kahta kenttää suoraan alkuperäiseen paikkaan joudutaan lukitsemaan rivi myös lukemiselta tai muuten voidaan saada rikkinäistä dataa. Ja tällöin tehokkuus on aika heikkoa (näin toimi esim. MySQL hyvin pitkään, select oli nopsaa mutta yksikin update tai insert ja koko kanta odotteli).

Myös jos kannassa on vaikkapa vaihtelevanpituisia merkkijonoja ei niitä voi suoraan vanhan kohtaan kirjoitella, joten silloinkin joudutaan tekemään kopio rivistä tai jos teksti säilytetään erillään tehdään uusi tekstiblokki ja siirretään tietueesta osoitin sinne.

Tämän lisäksi sitten indeksien päivitykset jne jne jne. Mitään yksinkertaista tuo homma ei ole, jos halutaan eheys ja tehokkuus säilyttää. Jompi kumpi saavutetaan helpommin, eheys varsinkin.

Transaktiolokeja taas on sellaisia, joissa tosiaan säilötään vanhaa kamaa pitkäänkin (esim. SQL Server vakioasetuksilla) tai sitten sellaisia, joissa säilötään vain hetken tietoja ja sen jälkeen tungetaan ne itse kantaan ja tyhjätään lokit. Kummassakin puolensa ja tarpeen mukaan valitaan mikä sopii.

Grez [10.04.2007 18:44:01]

#

SQL Serverissä voi määritellä säilytetäänkö niitä vai ei. Mutta mielestäni ne on järkevää säilyttää, koska silloin pääsee helposti korjaamaan esim. inhimillisten virheiden aiheuttamat ongelmat jälkikäteen.

A-P [13.04.2007 11:59:46]

#

neau33 kirjoitti:

Mitä tapahtuu kun tietokanta avataan ja tauluun päivitetaään yhden sarakkeen kenttään uusi tieto... Avataanko silloin jokin tiedosto, edelleen mitä luetaan muistiin ja mitä kirjoitetaan takaisin massamuistiin?

HSQLDB:ssä on tila, missä tietokanta on kokonaisuudessaan muistissa. Kun tietokanta avataan, oikeasti luetaan asetustiedosto joka sisältää komennot tietokantataulujen luomiseen ja sisällön lisäämiseen. Tällaisessa tapauksessa käynnistyminen on hidasta ja muistia kuluu, mutta vastapainona kyselyt nopeutuvat, koska tieto on valmiiksi muistissa.

Veikkaisin, että yleisesti ottaen tietokantamoottorit tasapainoilevat tiedon muistissa säilyttämisen ja levyltä lataamiseen suhteen. Tietokannan tieto on fyysisesti levyllä tiedosto(i)ssa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta