Tietokantarakenteet ja -algoritmit Harjoitukset 1-12



Samankaltaiset tiedostot
Tietokantarakenteet ja -algoritmit 3. harjoitus

Tietokantarakenteet ja -algoritmit 6. harjoitus

R 2 [0] ei ole likainen luku, sillä avaimelle 0 on jo palautettu sen alkuperäinen arvo.

Lisätään avainarvo 6, joka mahtuu lehtitasolle:

Lisätään avainarvo 1, joka mahtuu lehtitasolle:

Lokin ylläpito ja puskurinhallinta

Transaktioiden peruutus ja tietokannan elvytys häiriöstä

T Transaktionhallinta tietokantajärjestelmissä

Helsingin yliopisto/ tktl DO Tietokantojen perusteet, s 2000 Relaatioalgebra Harri Laine 1. Relaatioalgebra

Elvytys. R & G Chapter Tietokannan hallinta, kevät 2006, J. Li 1

oheishakemistoja voi tiedostoon liittyä useita eri perustein muodostettuja

58131 Tietorakenteet (kevät 2009) Harjoitus 6, ratkaisuja (Antti Laaksonen)

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

Algoritmit 2. Luento 6 To Timo Männikkö

3. Tietokannan hakemistorakenteet

3. Tietokannan hakemistorakenteet

Transaktioiden eristyvyys

D B. Transaktionhallinta - samanaikaisuus. Transaktionhallinta - samanaikaisuus. Transaktionhallinta - samanaikaisuus

D B. Tietokannan hallinta kertaus

Algoritmit 2. Luento 6 Ke Timo Männikkö

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

HAAGA-HELIA Heti-09 1 (14) ICT05: Tiedonhallinta ja Tietokannnat O.Virkki Transaktionkäsittely

D B. Kyselyjen käsittely ja optimointi. Kyselyn käsittelyn vaiheet:

Helsingin yliopisto/tktl Tietokannan hallinta, kevät Harri Laine 1 D B. Transaktionhallinta - samanaikaisuus

Transaktiot - kertausta

Ohjelmoinnin peruskurssi Y1

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

Seminaari: Keskusmuistitietokannat. Keskusmuistitietokantojen samanaikaisuuden hallinta Ilkka Pullinen

D B. Harvat hakemistot. Harvat hakemistot

1 2 x2 + 1 dx. (2p) x + 2dx. Kummankin integraalin laskeminen oikein (vastaukset 12 ja 20 ) antaa erikseen (2p) (integraalifunktiot

Algoritmit 1. Luento 13 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

CSE-A1200 Tietokannat

Relaatioalgebra. Relaatioalgebra. Relaatioalgebra. Relaatioalgebra - erotus (set difference) Kyselyt:

Kyselyt: Lähtökohtana joukko lukuja Laskukaava kertoo miten luvuista lasketaan tulos soveltamalla laskentaoperaatioita

Matematiikan tukikurssi

Looginen tietokanta ja transaktiot

Luku 8. Aluekyselyt. 8.1 Summataulukko

Tiedostorakenteet. R&G Chapter Tietokannan hallinta, kevät 2006, Jan 1

D B. Levykön rakenne. pyöriviä levyjä ura. lohko. Hakuvarsi. sektori. luku-/kirjoituspää

Relaatioalgebra. Kyselyt:

Tietokannan hallinta. Kevät 2004 Jan Lindström R&G Chapter 1

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

Algoritmit 1. Luento 5 Ti Timo Männikkö

Tietokantakurssit / TKTL

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

5. Tapahtumien hallinta. Esim. pankkitilisovelluksen proseduuri tilisiirto(t1, t2, x), joka siirtää x mk tililtä t1 tilille t2:

HELIA 1 (14) Outi Virkki Tiedonhallinta

Samanaikaisuuden hallinta. Optiot transaktionaalisissa työnkuluissa

Transaktioiden samanaikaisuuden hallinta

HELIA 1 (14) Outi Virkki Tiedonhallinta

4.3. Matemaattinen induktio

CS-A1150 Tietokannat CS-A1150 Tietokannat / 43

Jokaisella tiedostolla on otsake (header), joka sisältää tiedostoon liittyvää hallintatietoa

Algoritmit 2. Luento 2 To Timo Männikkö

Harjoitustyö. CSE-A1200 Tietokannat! Jasse Lahdenperä! ! Henri Nurmi! !

v 1 v 2 v 3 v 4 d lapsisolmua d 1 avainta lapsen v i alipuun avaimet k i 1 ja k i k 0 =, k d = Sisäsolmuissa vähint. yksi avain vähint.

f(x, y) = x 2 y 2 f(0, t) = t 2 < 0 < t 2 = f(t, 0) kaikilla t 0.

Tietorakenteet, laskuharjoitus 7, ratkaisuja

Solmu 3/2001 Solmu 3/2001. Kevään 2001 ylioppilaskirjoitusten pitkän matematiikan kokeessa oli seuraava tehtävä:

Hakemistorakenteet. R & G Chapter Tietokannan hallinta, kevät 2006, Jan 1

B + -puut. Kerttu Pollari-Malmi

AVL-puut. eräs tapa tasapainottaa binäärihakupuu siten, että korkeus on O(log n) kun puussa on n avainta

Käsitellyt hakemistot (hajautus, ISAM): hakemisto-osa on staattinen eli ei muutu muuten kuin uudelleenorganisoinnissa.

HELIA 1 (17) Outi Virkki Tiedonhallinta

Hakemistotyypeistä. Hakemistorakenteet. Hakemiston toteutuksesta. Hakemiston toteutuksesta

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, , H.Laine

Muita transaktioiden hallintamenetelmiä

Liitosesimerkki Tietokannan hallinta, kevät 2006, J.Li 1

B-puu. 3.3 Dynaamiset hakemistorakenteet

Helsingin yliopisto/tktl DO Tietokantojen perusteet, s 2000 Johdanto & yleistä Harri Laine 1. Tietokanta. Tiedosto

joukko operaatioita, joilla relaatioista voidaan muodostaa uusia relaatioita joukko opin perusoperaatiot yhdiste, erotus, ristitulo, leikkaus

Helsingin yliopisto/tktl Tietokannan hallinta, kevät Harri Laine 1 D B. Transaktionhallinta. Transaktionhallinta. Transaktionhallinta

Peliteoria luento 1. May 25, Peliteoria luento 1

Transaktiopalvelimen rakenne, s. 43. Levyjaksot, sivut ja tiedostot, s. 46. Tietokantasivujen puskurointi, s. 53. Tietokannan tila, s. 57.

2. Tietokannan tallennusrakenteet

Luento 2: Tiedostot ja tiedon varastointi

5.2 Samanaikaisuuden hallinta

Helsingin yliopisto/tktl Kyselykielet, s 2006 Optimointi Harri Laine 1. Kyselyn optimointi. Kyselyn optimointi

D B. Transaktionhallinta - samanaikaisuus

Helsingin yliopisto/ tktl D Tietokantojen perusteet, s 2000 Relaatioalgebra. Harri Laine 1. Relaatioalgebra.

CSE-A1200 Tietokannat

NORMALISOINTI TIETOJEN MALLINNUS JOUNI HUOTARI & ARI HOVI

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

Cabas liitännän käyttö AutoFutur ohjelmassa

Ehto- ja toistolauseet

D B. Tiedostojen käsittely

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Kurssikoe on maanantaina Muista ilmoittautua kokeeseen viimeistään 10 päivää ennen koetta! Ilmoittautumisohjeet löytyvät kurssin kotisivuilla.

Kuvaus eli funktio f joukolta X joukkoon Y tarkoittaa havainnollisesti vastaavuutta, joka liittää joukon X jokaiseen alkioon joukon Y tietyn alkion.

1 + b t (i, j). Olkoon b t (i, j) todennäköisyys, että B t (i, j) = 1. Siis operaation access(j) odotusarvoinen kustannus ajanhetkellä t olisi.

Algoritmit 2. Luento 3 Ti Timo Männikkö

Graafit ja verkot. Joukko solmuja ja joukko järjestämättömiä solmupareja. eli haaroja. Joukko solmuja ja joukko järjestettyjä solmupareja eli kaaria

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

D B. Harvat hakemistot

Kirjoita jokaiseen erilliseen vastauspaperiin kurssin nimi, tenttipäivä, oma nimesi (selkeästi), opiskelijanumerosi ja nimikirjoituksesi

CSE-A1200 Tietokannat

finnish BOI 2015, päivä 1. Muistiraja: 256 MB

Transkriptio:

Tietokantarakenteet ja -algoritmit Harjoitukset 1-12 Malliratkaisut 1 Harjoitus 1 1. Kukin DEPARTMENT-monikko d sijoitetaan omalle sivulleen. Sen seuraksi samalle sivulle sijoitetaan tähän liittyviä EMPLOYEE-monikoita niin monta kuin mahtuu. Loput d:hen liittyvät EMPLOYEE-monikot sijoitetaan sivuille, jotka ketjutetaan d:stä alkavaan ketjuun. Kustakin EMPLOYEE-monikosta e tallennetaan omaan tietueeseen kaikki muut attribuutit paitsi DeptNr, jonka arvo on tarpeen tallentaa vain kerran sivua kohti. Vrt. Oraclen cluster- rakenne. Uuden EMPLOYEE-monikon e lisäys: Kontataan lukusalpoja varaten osastonumeron n = e.deptnr hakupolku relaation DEPART- MENT hakemistossa sille sivulle q, joka sisältää DeptNr-attribuutin arvolla n varustettuun DEPARTMENT-monikkoon d osoittavan hakemistotietueen (n,r). Eristetään monikkotunnisteesta r sivunumero p ja tietuepaikan indeksi i. Naulitaan ja kirjoitussalvataan sivu p. Vapautetaan hakemistosivun q salpaus ja naulinta. Jos sivulla p on tilaa monikolle e, lisätään e sivulle p. Muutoin kontataan sivulta p lähtevä ketju kirjoitussalpoja varaten, kunnes päästään sivulle, jossa on tilaa monikolle e. Mikäli millään ketjun sivulla ei ole tilaa e:lle, varataan uusi sivu, joka linkitetään edellisten jatkoksi. Sivua varattaessa täytyy kirjoitussalvata myös varauskuvaajasivu. Viimeisetkin salvat ja naulinnat vapautetaan lisäysoperaation päätteeksi. 2. Lasketaan monikon (x,v) sisäisen esityksen pituus. Naulitaan ja lukusalvataan varauskuvaajasivu s. Valitaan sivu p, jossa on tilaa monikolle (x,v). Jos sellaista ei ole, valitaan sivu p, jossa mahdollisesti on tilaa monikolle (x,v). Naulitaan ja kirjoitussalvataan p. Sivu p valitaan monikon sijoituspaikaksi, jos siellä on tilaa sille. Muutoin vapautetaan p:n salpaus ja naulinta ja kokeillaan toista mahdollista sivua. Mikäli monikko (x,v) mahtuu sivulle p, toimitaan seuraavastio. Mikäli sivun p tilanvarausluokka (0,1,2) muuttuu monikon (x,v) lisäyksestä korkeammaksi eli täydemmäksi (1,2,3), vapautetaan s:n salpaus ja naulinta, ja naulitaan ja kirjoitussalvataan s, muutetaan s:ssä p:n varausluokka ja (tehokkuussyistä) vapautetaan s:n salpaus ja naulinta jo tässä vaiheessa. Lisätään monikko (x,v) sivulle p ja vapautetaan p:n salpaus ja naulinta. Mikäli halutaan varmistaa, että varausluokkamerkinnät ovat s:ssä aina oikein, täytyy s pitää salvattuna lisäysoperaation loppuun asti. Tarkemmassa vapaan tilan kirjauksessa varauskuvaajan alkio vie vähintään 10 bittiä, jolla voidaan osoittaa 1024 sanaa eli 4KB:n sivun vapaa tila sanoissa. Etuna on tarkka tieto. Haittana on varauskuvaajan suurempi koko ja (mikä 1

vielä pahempaa) ainainen tarve päivittää varauskuvaajaa, ja siis kirjoitusalvata asianomainen varauskuvaajasivu s, mikä estää muita samanaikaisia prosesseja tutkimasta s:ää. Tästä syystä tarkan varaustiedon kirjaus ei ole käytännöllistä. 3. Transaktio on oikeellinen, sillä transaktion sitoutumispisteessä viite-eheysrajoitteetkin ovat voimassa. Avainrajoitteet pysyvät voimassa transaktion sisälläkin. Avainrajoitteiden valvontaa varten täytyy monikon lisäyksen edelle tuottaa lukuoperaatio, jolla yritetään lukea relaatiosta lisättävän monikon avaimella varustettu tietue. Viite-eheysrajoitteiden valvontaa varten täytyy transaktion loppuun (juuri ennen commit-operaatiota) sijoittaa lukuoperaatiot, joilla luetaan viitatusta relaatiosta lisätyn monikon viiteavaimen arvolla varustettu monikko. Tietääkseni kaikissa järjestelmissä ei ole mahdollista toteuttaa viite-eheysrajoitteiden tällaista viivästettyä valvontaa. Silloin on sovellusohjelmoijan huolehdittava siitä, että viite-eheysrajoite pudotetaan transaktion aluksi tilapäisesti pois ja asetetaan takaisin transaktion lopuksi (mikä laukaisee valvontaoperaation). 4. a) R[x 1, >, v 1 ] R[x 2, > x 1, v 2 ]...R[x n, > x n 1, v n ]C. b) R[x 1, > y, v 1 ] D[x 1, v 1 ]I[x 1, v 1 +1] R[x 2, > x 1, v 2 ] D[x 2, v 2 ]I[x 2, v 2 +1]...R[x n, > x n 1, v n ] D[x n, v n ]I[x n, v n + 1]C. c) R[x 1, > y, v 1 ]D[x 1, v 1 ]I[x 1, v 1 +1] R[x 2, > x 1, v 2 ]D[x 2, v 2 ]I[x 2, v 2 +1]...R[x n, > x n 1, v n ] D[x n, v n ]I[x n, v n +1] AD[x n, v n +1]I[x n, v n ]...D[x 2, v 2 +1]I[x 2, v 2 ]D[x 2, v 2 + 1]I[x 2, v 2 ]C. 5. Transaktiomallin laajennos: Uusia operaatioita, jotka voivat esiintyä transaktion etenemisvaiheessa: S[P]: asettaa peruutuspisteen P. G[P]: aloittaa peruutuksen peruutuspisteeseen P. C[P]: kirjaa osittaisperuutuksen P:hen päättyneeksi. Etenemisvaihe voi koostua yhdestä tai useammasta peräkkäisestä, muotoa ops 1 S[P] ops 2 G[P] undo(ops 2 ) C[P] ops 3 olevasta osajonosta, missä ops 1, ops 2 ja ops 3 ovat operaatiojonoja (näiden tarkan syntaksin jätän tässä sanomatta). Jono undo(ops 2 ) on (kuten luennoilla) jonon ops 2 peruutusjono, so. jonon W-operaatioiden käänteisoperaatioiden jono käänteisessä järjestyksessä. Em. jono on siis ekvivalentti jonon ops 1 ops 3 kanssa. Esimerkiksi transaktio BW [x 1, u 1, v 1 ] S[P 1 ] W [x 2, u 2, v 2 ] S[P 2 ] W [x 3, u 3, v 3 ] S[P 3 ] W [x 4, u 4, v 4 ] G[P 2 ] W [x 4, v 4, u 4 ] W [x 3, v 3, u 3 ] C[P 2 ] W [x 5, u 5, v 5 ] G[P 1 ] W [x 5, v 5, u 5 ] W [x 2, v 2, u 2 ] C[P 1 ] W [x 6, u 6, v 6 ] C on sitoutunut ja ekvivalentti transaktion BW [x 1, u 1, v 1 ]W [x 6, u 6, v 6 ]C kanssa. Transaktio 2

BW [x 1, u 1, v 1 ]S[P 1 ]W [x 2, u 2, v 2 ]G[P 1 ] W [x 2, v 2, u 2 ] C[P 1 ] W [x 3, u 3, v 3 ] AW [x 3, v 3, u 3 ] W [x 1, v 1, u 1 ]C. on peruuntunut ja luonnollisesti ekvivalentti transaktion BC kanssa. 2 Harjoitus 2 1. P i = puskurin i:s käytettävissä oleva sivu, R i = R:n i:s sivu, S i S:n i:s sivu LRU: P1 P2 P3 levyhakuja -------- ---------- R1 S1 S2 3 S3 S4 2 S5 1 -------- S2 S1 R2 3 S4 S3 2 S5 1 -------- R3 S1 S2 3 S3 S4 2 S5 1 -------- S2 S1 R4 3 S4 S3 2 S5 1 -------- R5 S1 S2 3 S3 S4 2 S5 1 -------- ---------- 30 MRU: P1 P2 P3 levyhakuja -------- ---------- R1 S1 S2 3 S3 1 S4 1 S5 1 3

-------- R2 S2 2 S3 1 S4 1 -------- R3 S1 2 S2 1 S3 1 S5 1 -------- R4 S1 2 S2 1 S4 1 S5 1 -------- R5 S1 2 S3 1 S4 1 S5 1 -------- ---------- 25 (algoritmin for jokainen S:n sivu toteutettu niin, että sivut käydään vuorotellen läpi alusta loppuun ja lopusta alkuun) MRU2: P1 P2 P3 levyhakuja -------- ---------- R1 S1 S2 3 S3 1 S4 1 S5 1 -------- R2 S4 2 S3 1 S2 1 -------- R3 S3 2 S4 1 S5 1 -------- R4 S2 2 S3 1 4

S4 1 -------- R5 S3 2 S2 1 S1 1 -------- ---------- 22 2. Etu: loki on hyvin tiivis; isostakin operaatiosta vain yksi pieni lokitietue. Haitat, jotka tekevät tälläisen lokin käytön mahdottomaksi: operaation fysiologinen toisto mahdotonta; peruutusvaiheessa järjestelmä ei pysty määrittelemään edes operaation loogista käänteisoperaatiota. Huomaa, että sama SQL-operaatio voi käynnistää eri suorituskerroilla aivan erilaisen operaatiosarjan esim. tietokantaan tallennettujen herättimien vaikutuksesta. Tietokantasovelluksen suunnittelijan pitäisi itse määritellä tarkasti transaktion jokaiselle SQL-operaatiolle sitä vastaava toisto- ja peruutusoperaatio. 3. Peruutuspisteen P asetus transaktiossa T kirjataan < T, S, P, n >, missä n = LastLSN(T). Osittaisperuutuksen aloitus G[P] kirjataan < T, G, P >. Osittaisperuutuksessa peruutettava päivitysoperaatio kirjataan redo-only-kirjauksella < T, undo(w ), p, i,w, x, u, n >, kun W:n kirjaus on T, W, p, i, W, x, u, v, n. Siis täsmälleen kuten keskeytyneen transaktion peruutusvaiheen käänteisoperaatio. Osittaisperuutuksen päättyminen C[P] kirjataan < T, C, P >, siis keskeytyneen transaktion peruutuksen päättämistä vastaavasti, mutta kuitenkaan pakottamatta lokia levylle. Välittömästi osittaisperuutuksen päättymisen jälkeen suoritettu T:n etenemisvaiheen päivitys W[x,u,v] kirjataan normaalilla redo-undo-kirjauksella < T, W, p, i, x, u, v, n >, missä LastLSN n on peruutuspisteen aloituskirjauksen LSN. Esimerkkitransaktion tuottamat lokikirjaukset: 101: < T, B > 102: <T, W, p 1, i 1, x 1, u 1, v 1, LastLSN=101> 103: <T, S, P, LastLSN=102> 104: <T, W, p 2, i 2, W, x 2, u 2, v 2, LastLSN=103> 105: <T, G, P> 106: <T, undo(w), p 2, i 2, x 2, u 2, UndoNextLSN=103> 107: <T, C, P> 108: <T, W, p 3, i 3, u 3, v 3, LastLSN=103> 109: <T, A> 5

110: <T, undo(w), p 3, i 3, x 3, u 3, UndoNextLSN=103> 111: <T, undo(w), p 1, i 1, x 1, u 1, UndoNextLSN=101> 112: <T, C> Tehtävän tarkoituksena oli osoittaa, että osittaisperuutuksien toteuttamiselle oikeastaan oli jo koneisto valmiina. 4. Idempotenttisuudesta on se etu, ettei elvytyksessä ole tarpeen tarkistaa sivun tilaa, ts. onko toistettava tai peruutettava päivitys jo sivulla vai ei. Arvoperustaiseen eli fyysiseen lokiin perustuvat toistot ja peruutukset ovat idempotentteja. Looginen toisto ja peruutus eivät ole lainkaan idempotentteja. Fysiologinen toisto tai peruutus saadaan idempotentiksi, jos operaatioon liitetään ehdoksi PageLSN:n tutkiminen, ts. toisto suoritetaan vain jos lokikirjauksen LSN > PageLSN, ja peruutus vain jos lokikirjauksen LSN <= PageLSN. 5. Lokitietueen ykkösbitit ilmaisevat, mitkä bitit muuttuivat korvattaessa alkukuva jälkikuvalla. Tietueeseen kohdistuvan operaation toisto toteutetaan suorittamalla tietueen ja lokitietueen välinen xor. Peruutus toteutetaan samoin suorittamalla tietueen ja lokitietueen välinen xor. Operaatiot eivät ole idempotentteja. Toisto toimii vain, jos operaation tulos ei vielä ole tietueessa. Peruutus toimii vain, jos operaation tulos on tietueessa. Huomaa, että kaksi peräkkäistä xor-operaatiota kumoavat toisensa. Menettely vaatii siis rinnalleen PageLSN:n. 6. Älä varasta -käytännössä levylle asti ei koskaan pääse likaista tietoa, joten häiriöstä elvyttäessä ei transaktioiden peruuntusvaiheen käänteisoperaatioita (periaatteessa) tarvitse lainkaan suorittaa. Tämä tosin pätee vain, jos elvytyksen toistovaiheessa jätetään vastaavasti toistamatta aktiivisten transaktioiden päivitykset. Lokikirjauksiin ei silloin tarvitse tallentaa alkukuvaa. Mutta miten hoidetaan transaktion peruuntuminen normaalin transaktionkäsittelyn kuluessa? Puskurisivuille on joka tapauksessa toteutettava käänteisoperaatiot. Päivitysten alkukuvat on siis säilytettävä jossain. Ajatus ei ole hyvä. Pakota-käytäntöä sovellettaessa ei häiriöstä elvyttäessä tarvitse suorittaa lainkaan toisto-operaatioita sitoutuneille tai peruuntuneille transaktioille. Lokikirjauksiin ei siis äkkipäätä ajatellen tarvittaisi jälkikuvaa. Mutta tämä ei pidä paikkaansa, sillä lokikirjaukset menevät WAL-käytännön mukaisesti levylle ennen tietokantasivuja, ja kesken sivujen levylle pakotuksen voi sattua häiriö niin, että levyllä onkin lokikirjaus, jota vastaavaa päivitystä ei ole levyllä. Tkhj ei voi samanaikaisesti noudattaa kumpaakin käytäntöä. Älä varasta ja pakota ovat näet toisensa poissulkevia: jos sivu pakotetaan levylle ennen kuin transaktio sitoutuu, sivu siis varastetaan. 3 Harjoitus 3 1. Analyysivaiheen alussa alustetaan aktiivisten transaktioiden taulu (tyhjä) ja päivitettyjen sivujen taulu (samoin tyhjä) tarkistuspisteestä. Lokin eteenpäin selauksessa saadaan transaktiotaulun sisällöksi 6

{(T 1, forward-rolling, LastLSN = 109), (T 2, backward-rolling, UndoNextLSN = 108)} ja päivitettyjen sivujen taulun sisällöksi {(p,reclsn = 107)}, mistä saadaan RedoLSN = 107. Merkitään: wl(p) = fix(p) & write-latch(p); ul(p) = unlatch(p) & unfix(p). Toistovaiheessa selataan lokia kirjauksesta RedoLSN = 107 eteenpäin. Päivityskirjausten kohdalla tehdään seuraavaa: 107: Koska 107 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. Koska PageLSN(p) = 108 107, operaation I[x,u] tulos on sivulla. ul(p). RecLSN(p) = 108 + 1 = 109. 108: Koska 108 < RecLSN(p), sivua p ei naulita eikä salvata. 109: Koska 109 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. Koska PageLSN(p) = 108 < 109, operaation I[y,v] tulosta ei ole sivulla. Lisätään monikko (y,v) sivulle p paikkaan j. PageLSN(p):ä 109. ul(p). 110: Koska 110 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. Koska PageLSN(p) == 109 < 110, operaation W[z,w,w ] tulosta ei ole sivulla. Muutetaan sivulla p paikassa k oleva monikko (z,w) monikoksi (z,w ). PageLSN(p) = 110. ul(p). 112: Koska 112 RecLSN(p), wl(p) ja tutkitaan PageLSN(p):tä. Koska PageLSN(p) = 110 < 112, operaation W 1 [z, w, w ] tulosta ei ole sivulla. Palautetaan sivulla p paikassa k oleva monikko (z,w ) monikoksi (z,w). PageLSN(p) = 112. ul(p). Peruutusvaiheessa asetetaan transaktiotaulussa T1:n tilaksi backward-rolling ja Undo- NextLSN:ä LastLSN = 109 ja kirjataan lokiin 113: < T 1, A > Transaktiotaulun UndoNextLSN:ien maksimi on max{109, 108} = 109. Ensimmäiseksi peruutetaan siis LSN:llä 109 kirjattu operaatio. wl(p). Poistetaan paikassa (p,j) oleva monikko (y,v). Kirjataan lokiin 114: < T 1, I 1, p, j, 107 > PageLSN(p) = 114. UndoNextLSN(T1) = 107. ul(p). Transaktiotaulun UndoNextLSN:ien maksimi on max{107, 108} = 108. Peruutetaan siis LSN:llä 108 kirjattu operaatio. wl(p). Poistetaan paikassa (p,k) oleva monikko (z,w). Kirjataan lokiin 115: < T 2, I 1, p, k, 106 > PageLSN(p) = 115. UndoNextLSN(T2) = 106. ul(p). Transaktiotaulun UndoNextLSN:ien maksimi on max{107, 106} = 107. wl(p). Poistetaan paikassa (p,i) oleva monikko (x,u). Kirjataan lokiin 116: < T 1, I 1, p, i, 105 > PageLSN(p) = 116. UndoNextLSN(T1) = 105. ul(p). Transaktiotaulun UndoNextLSN:ien maksimi on max{105, 106} = 106. LSN:llä 106 varustettu kirjaus on T2:n aloituskirjaus. Poistetaan T2 transaktiotaulusta, kirjataan lokiin 117: < T 2, C > 7

ja viedään loki levylle. Transaktiotaulun ainoa UndoNextLSN on 105. LSN:llä 105 varustettu kirjaus on T1:n aloituskirjaus. Poistetaan T1 transaktiotaulusta, kirjataan lokiin 118: < T 1, C > ja viedään loki levylle. Koska transaktiotaulu on tyhjä, peruutusvaihe on päättynyt. Lopuksi otetaan tarkistuspiste: 119: <begin-checkpoint> 120: <transaction-table, {}> 121: <page-table, {(p,reclsn = 109)}> 122: <end-checkpoint> 2. a) Sivu p on voitu viedä levylle (ja siis poistaa päivitettyjen sivujen taulusta) viimeisen tarkistuspisteen ottamisen jälkeen, ennen häiriötä. Rekonstruoidussa taulussa voi olla sivuja, jotka eivät taulussa enää olleet häiriötilanteessa, ja jonkin sivun RecLSN voi olla rekonstruoidussa taulussa häiriötilanteessa vallinnutta arvoa pienempi. b) Edellä tehtävässä 1 esiintyy juuri sellainen tilanne. 3. Toistovaihe saattaa tietokannan siihen tilaan, jossa se oli häiriöhetkellä. Näin ollen erikoisesti ne sivut, joilla oli (puskurissa) aktiivisten transaktioiden päivityksiä häiriötilanteessa, ovat toistovaiheen tuloksena puskurissa ja nämä puskurisivut täsmälleen ajan tasalla, so. sisältävät kaikki niille häiriötilanteeseen mennessä tehdyt ja lokin levyllä olevaan osaan ehtineet päivitykset. Siis peruutettavien päivitysten olemassaoloa ei tarvitse tutkia. 4. Fyysinen toisto onnistuu, koska toistovaiheessa operaatiot toistetaan yhdellä lokin eteenpäinselauksella täsmälleen samassa järjestyksessä kuin ne on alkujaan suoritettu. Lopputuloksena ovat fyysisestikin täsmälleen samansisältöiset sivut puskurissa (joskaan eivät välttämättä juuri entisissä puskurikehyksissä). Jos peruutusvaihe edeltää toistovaihetta, ei fyysinen toisto enää aina ole mahdollista. Oletetaan, että häiriön sattuessa lokin sisältönä on: 100: < T 1, B > 101: < T 1, D, p, i, x, u, 100 > 102: < T 2, B > 103: < T 2, I, p, j, y, v, 102 > 104: < T 2, C > Oletetaan, että tässä sivu p on täynnä T2:n lisäysoperaation jälkeen. T2 on siis kuluttanut T1:n poisto-operaation vapauttaman tilan sivulla p. Oletetaan vielä, että T1:n operaation tulos on ehtinyt levylle asti, mutta T2:n ei, ts. PageLSN(p) = 101 sivun p levyversiossa. Häiriöstä elvytyksessä peruutetaan ensin T1. Tämä onnistuu tällä kertaa fyysisesti: 105: < T 1, A > 106: < T 1, D 1, p, i, x, u, 100 > 107: < T 1, C > 8

Sitten yritetään toistaa T2. Tämä ei onnistu enää sivulle p, joka on nyt täynnä tietueita. Täytyy varata uusi tyhjä sivu q ja suorittaa toisto sinne. Nyt täytyy lokiin tehdä kirjaus myös toisto-operaatiosta: 108: < T 2, I, q, k, y, v, 102 > ja täytyy toistaa myös sitoutumiskirjaus: 109: < T 2, C > Tämä näyttää jo epäilyttävältä ei varmaan saada toimimaan kunnolla! 5. Kaikissa tapauksissa elvytys aloitetaan uudelleen alusta. a) Analyysivaiheessa ainoastaan luetaan lokia ja alustetaan keskusmuistitietorakenteita (aktiivisten transaktioiden taulu ja päivitettyjen sivujen taulu). Uuden häiriön sattuessa nämä analyysitiedot menetetään, joten pitää aloittaa alusta. b) Toistovaiheessa saatetaan tietokanta (puskurissa) siihen tilaan, jossa se oli häiriöhetkellä. Sivuja tuodaan levyltä ja edistetään niiden tilaa niillä päivityksillä, jotka eivät olleet ehtineet levylle asti. Vaiheen aikana puskurinhallitsin voi viedä näitä sivuja levyllekin. Uuden häiriön sattuessa samat sivut haetaan uudestaan puskuriin. Erona edelliskertaan voi olla, ettei jotain toistettavaa päivitystä tarvitsekaan toistaa puskurissa, koska sivun p levyversion PageLSN oli edistynyt. c) Peruutusvaiheessa kirjataan operaatioiden peruutuksista lokitietueita. Kun uuden häiriön satuttua on suoritettu analyysi- ja toistovaihe, on peruuntuvien transaktioiden peruutuskirjauksia vastaavat käänteisoperaatiotkin toistettu, joten peruutusvaiheessa jatketaan vanhojen peruuntuvien transaktioiden peruutusta siitä, mihin viime kerralla jäätiin ja keskeytetään ja peruutetaan uuden häiriön sattuessa etenemisvaiheessaan olleet transaktiot. Peruutus ei siis koskaan peruunnu, vaan edistyy (mikä seikka sisältyy jo transaktiomalliimmekin). 6. Olkoon TT viimeisessä valmiiksi ehtineessä tarkistuspisteessä CP vedostettu aktiivisten transaktioiden taulu ja PT päivitettyjen sivujen taulu. Määrätään seuraavat LSNt: n 1 = min{t:n aloituskirjauksen LSN T on TT:n transaktio}. n 2 = min{reclsn(p) p on PT:n sivu}. n 3 = tarkistuspisteen CP begin-checkpoint-tietueen LSN. Lokista voidaan silloin hävittää kaikki tietueet, joiden LSN on pienempi kuin n = min{n 1, n 2, n 3 }. Itse asiassa n:ää voidaan tarkentaa analyysivaiheessa. 4 Harjoitus 4 1. Ajoitus voidaan ajaa esim. eheässä tietokannassa {(x, u), (y, 1)}, jolloin tuloksena on epäeheä tietokanta {(x, v), (y, 0)}. Ajoituksen ainoa eristyneisyysanomalia on T 2 :n likainen kirjoitus I 2 [x, v]. 9

2. Ajoitus voidaan ajaa esim. eheässä tietokannassa {(0, 3), (1, 1), (2, 2), (3, 3)}, jolloin tuloksena on epäeheä tietokanta {(0, 4), (1, 1), (2, 2), (3, 3)}. Ajoituksen ainoa eristyneisyysanomalia on T 1 :n likainen luku R 1 [3, > 1, 3]. 3. Ajoituksen ainoa eristyneisyysanomalia on T 2 :n likainen luku R 2 [2, 0, v]. T 1 :n täydennysjono on G 1 = A 1 D1 1 [1, u]c 1 ja T 2 :n täydennysjono on G 2 = A 2 W2 1 [2, v, v + 1]C 2. Olkoon G jokin G 1 :n ja G 2 :n limite. Silloin HG:ssä esiintyy samat anomaliat kuin H:ssakin. Lisäksi esiintyy toistokelvoton luku, jos limitetään täydennysjonot seuraavasti: B 1 D 1 [1, u]b 2 R 2 [2, 0, v]w 2 [2, v, v + 1] A 1 D1 1 [1, u]c 1 A 2 W2 1 [2, v, v + 1]C 2. Tässä käänteisoperaatio D1 1 [1, u] tekee lukuoperaatiosta R 2 [2, 0, v] toistokelvottoman. Mutta tämä esiintyy vain, koska vastaava etenevän vaiheen operaatio D 1 [1, u] puolestaan tekee lukuoperaatiosta likaisen. Muita anomalioita ei voi esiintyä. Likaisia kirjoituksia ei voi olla, koskei niitä ollut H:ssakaan. Likaisia lukuja ei voi olla, koskei peruutusvaiheessa ole lukuoperaatioita. 4. Transaktion toteutuksessa relaatio r varmaankin käydään läpi kolme kertaa: kerran avg(v)- koosteen laskentaa varten, kerran sum(v)-koosteen laskentaa varten ja kerran count(*)- koosteen laskentaa varten. a) L = read committed, ts. likaiset luvut estetty. Koska toistokelvottomia lukuja voi esiintyä, saman r-monikon luku toistamiseen voi tuottaa eri V-arvon kuin edellisellä lukukerralla. Koska haamuja voi esiintyä, eri lukukerroilla voi tulla luetuksi eri joukko r-monikoita. Tulos voi olla a 1 = s 1 /c 1, a 2 = s 2 /c 2, missä a 1 a 2, s 1 s 2 tai c 1 c 2. b) L = repeatable read, ts. toistokelvottomat luvut, haamuja lukuunottamatta, on estetty. Haamujen takia tulos voi olla yhtä epäjohdonmukainen kuin a-kohdassa. L = serializable, ts. haamutkin on estetty. Silloin tulos on aina s/c, s/c. 5. Olkoot T 1 ja T 2 eteneviä tai sitoutuneita transaktioita. T 2 :n likainen kirjoitus: (1) T 1 lisää monikkojoukon s 1, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 poistaa ehdon P 2 täyttävien monikoiden joukon s 2, missä jokin s 1 :n monikko täyttää ehdon P 2 tai monikkojoukkojen s 1 ja s 2 monikoiden avainten joukot leikkaavat....i 1 [s 1 ]...D 2 [P 2, s 2 ]... T 1 poistaa ehdon P 1 täyttävien monikoiden joukon s 1, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 lisää monikkojoukon s 2, missä jokin s 2 :n monikko täyttää ehdon P 1 tai monikkojoukkojen s 1 ja s 2 monikoiden avainten joukot leikkaavat....d 1 [P 1, s 1 ]...I 2 [s 2 ]... 10

T 2 :n likainen luku: (1) T 1 lisää monikkojoukon s 1, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 lukee ehdon P 2 täyttävien monikoiden joukon s 2, missä jokin s 1 :n monikko täyttää ehdon P 2 (eli kuuluu s 2 :een)....i 1 [s 1 ]...R 2 [P 2, s 2 ]... (2) T 1 poistaa ehdon P 1 täyttävien monikoiden joukon s 1, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 lukee ehdon P 2 täyttävien monikoiden joukon s 2, missä jokin s 1 :n monikko täyttää ehdon P 2 (ts. olisi tullut luetuksi, ellei T 1 olisi sitä poistanut)....d 1 [P 1, s 1 ]...R 2 [P 2, s 2 ]... T 1 :n toistokelvoton luku: (1) T 1 lukee ehdon P 1 täyttävät monikot, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 lisää monikkojoukon s 2, jonka jokin monikko täyttää ehdon P 1....R 1 [P 1, s 1 ]...I 2 [s 2 ]... (2) T 1 lukee ehdon P 1 täyttävät monikot, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 poistaa ehdon P 2 täyttävien monikoiden joukon s 2, jonka jokin monikko täyttää ehdon P 1 (ts. s 1 ja s 2 leikkaavat)....r 1 [P 1, s 1 ]...D 2 [P 2, s 2 ]... Yleisessä tapauksessa, so. kun T 1 tai T 2 voi olla myös peruuntuva tai peruutuksensa päättänyt, anomaliat määritellään muokaten luentojen sivujen 100-102 määritelmät tähän transaktiomalliin. 5 Harjoitus 5 1. B 1 : T 1 alkaa. I 1 [1]: T 1 :lle pitkäkestoinen X-lukko avaimeen 1 ja lyhytkestoinen X-lukko avaimen 1 seuraajaan. B 2 : T 2 alkaa. I 2 [2]: T 2 :lle pitkäkestoinen X-lukko avaimeen 2 ja lyhytkestoinen X-lukko avaimen 2 seuraajaan. B 3 : T 3 alkaa. I 3 [3]: T 3 :lle pitkäkestoinen X-lukko avaimeen 3 ja lyhytkestoinen X-lukko avaimen 3 seuraajaan. A 2 : T 2 keskeytyy. I2 1 [2]: T 2 poistaa avaimen 2 tietokannasta siihen omistamansa X-lukon turvin. C 2 : T 2 päättää peruutuksensa ja vapauttaa lukkonsa. C 3 : T 3 sitoutuu ja vapauttaa lukkonsa. I 1 [2]: T 1 :lle pitkäkestoinen X-lukko avaimeen 2 ja lyhytkestoinen X-lukko avaimen 2 seuraajaan 3. 11

Ajoitus on mahdollinen. Tietokannassa lopuksi avaimet 1, 2 ja 3. Transaktioiden sarjallistuvuusjärjestyksiä on kolme: T 2 T 1 T 3, T 2 T 3 T 1, T 3 T 2 T 1 (ts. T 2 ennen T 1 :tä). Huomaa, että ajoitus johtaisi lukkiumaan, jos käänteisoperaatiolle I2 1 [2] pitäisi varata lukkoja kuten etenevän vaiheen D 2 [2]:lle. 2. B 1 : T 1 alkaa. D 1 [0]: T 1 :lle lyhytkestoinen X-lukko avaimeen 0 ja pitkäkestoinen X-lukko avaimen 0 seuraajaan. A 1 : T 1 keskeytyy. D1 1 [0]: T 1 palauttaa avaimen 0 tietokantaan seuraajan X-lukon turvin. B 2 : T 2 alkaa. R 2 [0]: T 2 :lle pitkäkestoinen S-lukko avaimeen 0. Onnistuu! C 2 : T 2 sitoutuu. T 2 vapauttaa avaimen 0 lukkonsa. C 1 : T 1 päättää peruutuksensa. T 1 vapauttaa avaimen lukkonsa. R 2 [0] ei ole likainen luku, sillä avaimelle 0 on jo palautettu sen alkuperäinen arvo. 3. B 1 : T 1 alkaa. D 1 [0]: T 1 :lle lyhytkestoinen X-lukko avaimeen 0 ja pitkäkestoinen X-lukko avaimen 0 seuraajaan. I 1 [0]: T 1 :lle pitkäkestoinen X-lukko avaimeen 0. D 1 [0]: T 1 pitää kummankin X-lukkonsa. A 1 : T 1 keskeytyy. D1 1 [0]: T 1 palauttaa avaimen 0 tietokantaan seuraajan X-lukon turvin. B 2 : T 2 alkaa. R 2 [0]: T 2 yrittää varata pitkäkestoista S-lukkoa avaimeen 0. Tämä ei onnistu, vaan T 2 joutuu odottamaan. Ajoitus ei siis ole mahdollinen. Huomaa, ettei avain 0 vielä ole sitoutunut siinä vaiheessa, kun D1 1 [0] on suoritettu. Vielä on avaimen 0 päivityksiä T 1 :ssä peruuttamatta. R 2 [0] on likainen luku. 4. Ajoituksessa B 1 D 1 [1]B 2 I 2 [2] ei ole yhtään eristyneisyysanomaliaa, mutta se ei kuitenkaan ole mahdollinen avainvälilukituskäytännöss Tietokannassa {(1, 1), (3, 3)} ajettuna T 2 ei voi saada lyhytkestoista X-lukkoa avaimen 2 seuraajaan 3, koska T 1 :llä on siihen pitkäkestoinen X-lukko (otettu operaatiota D 1 [1] varten). 5. Olkoot T 1 ja T 2 eteneviä tai sitoutuneita transaktioita. T 2 :n likainen kirjoitus: T 1 päivittää avaimella x varustettua monikkoa, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 päivittää avaimella x varustettua monikkoa....w 1 [x]...w 2 [x]... T 2 :n likainen luku: (1) T 1 päivittää monikkoa (x,a,v), minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 lukee operaatiolla R[x, a, v ] monikon (x, a, v ). 12

...W 1 [x]...r 2 [x]... (2) T 1 päivittää monikkoa (x,a,v), minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 lukee operaatiolla R[a,s] monikkojoukon s....w 1 [x, a, v, a, v ]...R 2 [a, s]... (3) T 1 päivittää monikon (x,a,v) monikoksi (x, a, v ), minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 lukee operaatiolla R[a, s] monikkojoukon s....w 1 [x, a, v, a, v ]...R 2 [a, s]... T 1 :n toistokelvoton luku: (1) T 1 lukee operaatiolla R[x,a,v] monikon (x,a,v), minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 päivittää avaimella x varustettua monikkoa....r 1 [x]...w [x]... (2) T 1 lukee operaatiolla R[a,s] monikkojoukon s, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 päivittää monikkoa (x,a,v)....r 1 [a, s]...w [x, a, v, a, v ]... (3) T 1 lukee operaatiolla R[a, s] monikkojoukon s, minkä jälkeen, T 1 :n ollessa vielä aktiivinen, T 2 päivittää monikon (x,a,v) monikoksi (x, a, v )....R 1 [a, s]...w 2 [x, a, v, a, v ]... Yleisessä tapauksessa, so. kun T 1 tai T 2 voi olla myös peruuntuva tai peruutuksensa päättänyt, anomaliat määritellään muokaten luentojen sivujen 100-102 määritelmät tähän transaktiomalliin. Tarkastellaan ensin lukituskäytäntöä, jossa W- ja R-operaatioita varten varataan lukkoja seuraavasti: W[x]: pitkäkestoinen X-lukko avaimeen x. R[x,a,v]: pitkäkestoinen S-lukko avaimeen x. R[a,s]: pitkäkestoinen S-lukko s:n jokaisen monikon (x,a,v) avaimeen x. Tämä lukituskäytäntö estää likaiset kirjoitukset, muotoa (1) tai (3) olevat likaiset luvut sekä muotoa (1) tai (2) olevat toistokelvottomat luvut, muttei muotoa (2) olevia likaisia lukuja eikä muotoa (3) olevia toistokelvottomia lukuja. Muotoa (2) olevat likaiset luvut estyvät, jos operaatiota W [x, a, v, a, v ] varten varataan pitkäkestoinen X-lukko attribuuttiarvoon a ja operaatiota R[a,s] varten vähintään lyhytkestoinen S-lukko a:han. Muotoa (3) olevat toistokelvottomat luvut estyvät, jos operaatiota R[a,s] varten varataan pitkäkestoinen S-lukko attribuuttiarvoon a ja operaatiota W [x, a, v, a, v ] varten vähintään lyhytkestoinen X-lukko arvoon a. 6 Harjoitus 6 1.. a) T1 = B I[b, r 2, 0, 0] IX-lukitaan järjestelmä s, tietokanta b ja relaatio (b, r 2 ) (tässä järjestyksessä), 13

X-lukitaan (b, r 2, 0) ja (b, r 2, 1), lisätään monikko (0,0) relaatioon (b, r 2 ) ja vapautetaan avaimen (b, r 2, 1) X-lukko. I[b, r 1, XV ] IX-lukot s:ään ja b:hen T 1 :llä jo on; X-lukitaan (b, r 1 ) ja (b, r 2 ), luodaan relaatio r 1 (XV ) tietokantaan b ja pudotetaan relaation (b, r 2 ) lukko takaisin IX-lukoksi. I[b, r 1, 1, 1] IX-lukko s:ään T 1 :llä jo on, ja relaatioon (b, r 1 ) T 1 :llä on IX-lukkoa korkeampi X-lukko, joten monikkokohtaisia X-lukkoja ei ole tarpeen varata lainkaan. Lisätään monikko (1,1) relaatioon (b, r 1 ). C Vapautetaan T 1 :n hallussa olevat lukot avaimiin (b, r 2, 0), (b, r 2 ), (b, r 1 ), b ja s. b) T2 = B R[b, r 2, x, 1, v] IS-lukitaan s, b ja (b, r 2 ) (tässä järjestyksessä), S-lukitaan (b, r 2, x), luetaan tietue (b, r 2, x, v). W [b, r 2, 2, u, v] IX-lukitaan s, b ja (b, r 2 ) (tässä järjestyksessä, IS-lukot korotetaan IX-lukoiksi), X-lukitaan (b, r 2, 2) ja päivitetään monikko (2,u) monikoksi (2,v). C Vapautetaan T 2 :n hallussa olevat lukot avaimiin (b, r 2, 1), (b, r 2, 2), (b, r 2 ), b ja s. c) Kyllä ajoitus on mahdollinen. 2. a) Pitkäkestoinen X-lukko relaatioon r ja lyhytkestoinen X-lukko r:n seuraajaan. b) Pitkäkestoinen IS-lukko r:ään ja pitkäkestoinen S-lukko avaimeen (r,x). c) Count-kyselyä varten pitkäkestoinen S-lukko r:ään (tai pitkäkestoinen IS-lukko r:ään ja pitkäkestoiset S-lukot kaikkiin r:n monikoihin, mikä on työlästä). Insertoperaatiota varten r:n S-lukko (vast. IS-lukko) korotetaan SIX-lukoksi (tai vast. IS-lukko IX-lukoksi) ja varataan pitkäkestoinen X-lukko avaimeen (r,122) ja lyhytkestoinen X-lukko avaimen (r,x) seuraajaan. Haittoja siitä, ettei lukituksessa oteta huomioon relaatiotason yläpuolella olevia rakeisuustasoja: Tietokannoissa voi esiintyä haamurelaatioita ja järjestelmässä haamutietokantoja. Toinen haitta on lukituksen tehottomuus: paljon lukkoja alemmilla tasoilla. 3. Kohdistimen vakaudella ajettava transaktio T: B: T alkaa. R[x 1 ]: T:lle S-lukko avaimeen x 1. T:n S-lukko avaimeen x 1 vapautetaan, koskei x 1 :tä päivitetä. R[x 2 ]: T:lle S-lukko avaimeen x 2. W [x 2 ]: T:n S-lukko avaimeen x 2 korotetaan pitkäkestoiseksi X-lukoksi. R[x 3 ]: T:lle S-lukko avaimeen x 3. T:n S-lukko avaimeen x 3 vapautetaan, koskei x 3 :a päivitetä. C: T sitoutuu. T:n X-lukko avaimeen x 2 vapautetaan. 4. a) Täysin eristyneesti: B: T alkaa. R[x 1 ]: T:lle U-lukko avaimeen x 1. T:n U-lukko avaimeen x 1 lasketaan S-lukoksi, koskei x 1 :tä päivitetä. 14

R[x 2 ]: T:lle U-lukko avaimeen x 2. W [x 2 ]: T:n U-lukko avaimeen x 2 korotetaan X-lukoksi. R[x 3 ]: T:lle U-lukko avaimeen x 3. T:n U-lukko avaimeen x 3 lasketaan S-lukoksi, koskei x 3 :a päivitetä. C: T sitoutuu. Vapautetaan T:n lukot: x 1 :n S-lukko, x 2 :n X-lukko ja x 3 :n S-lukko. b) Kohdistimen vakaudella: B: T alkaa. R[x 1 ]: T:lle U-lukko avaimeen x 1. T:n U-lukko avaimeen x 1 vapautetaan, koskei x 1 :tä päivitetä. R[x 2 ]: T:lle U-lukko avaimeen x 2. W [x 2 ]: T:n U-lukko avaimeen x 2 korotetaan X-lukoksi. R[x 3 ]: T:lle U-lukko avaimeen x 3. T:n U-lukko avaimeen x 3 vapautetaan, koskei x 3 :a päivitetä. C: T sitoutuu. T:n X-lukko avaimeen x 2 vapautetaan. 5. Luku-kirjoitusmallissa kaikki täyteen eristyneisyyteen tarvittavat X-lukot saadaan hankituksi lokikirjauksista. Avainvälimallissa tämä on mahdollista vain, jos poisto-operaation D[x,v] lokikirjaukseen laitetaan myös avaimen x seuraaja-avain y. Operaation D[x,v] käänteisoperaation näet pitää suorittaa x:n seuraajaan y hankitun X-lukon turvin. Ks. luentojen sivu 155. Peruuntuvalle transaktiolle ei kuitenkaan voida hankkia S-lukkoja niiden etenemisvaiheessa mahdollisesti tekemien lukuoperaatioidensa suojaksi. Tämä voi aiheuttaa sen, että järjestelmään tuleva uusi transaktio tekee päivitysoperaation avaimeen x ennen kuin sitä lukenut peruuntuva transaktio ehtii päättää peruutuksensa. Tekeekö tämä päivitys siis lukuoperaatiosta toistokelvottoman. Vastaus on: ei. Olemme näet sulkeneet tämän tilanteen pois toistokelvottoman luvun määritelmästä (luentojen sivu 102). Perusteluna on, ettei tämä tilanne missään tapauksessa voi aiheuttaa mitään eheyden rikkoumaa. Siis peruuntuvienkin transaktioiden suoritus on täysin eristynyttä. 6. ts(t1) = 1, ts(t2) = 2, ts(t3) = 3. a) B1 W 1 [1] : wts(1) := 1 R 1 [2]rts(2) := 1 B 2 W 2 [2] Havaitaan, että avaimen 2 tuorein lukija T 1 on eri kuin T 2 ja aktiivinen, joten T 2 keskeytetään. Näin estyy toistokelvoton luku. b) B1 R 1 [1] : rts(1) := 1. B 2 R 2 [1] : rts(1) := 2. C 2 B 3 W 3 [1] Havaitaan, että avaimen 1 tuorein lukija T 2 on T 3 :a aikaisempi ja sitoutunut, joten operaatio W 3 [1] hyväksytään, vaikka se tekeekin T 1 :n operaatiosta R 1 [1] toistokelvottoman. wts(1):=3. C 3 W 1 [4] : wts(4) := 1. Tämä päivitys voi perustua operaation R 1 [1] lukemaan 15

epäajankohtaiseen arvoon. C 1 Miten estettäisiin toistokelvottomat luvut? Vai onko lainkaan tarpeen, ts. voiko niistä olla haittaa? c) B 1 B 2 W 2 [1] : wts(1) := 2. C 2 R 1 [1] Havaitaan, että T 1 :tä myöhäisempi transaktio T 2 on jo kirjoittanut avaimen 1, joten T 1 peruutetaan. Ajoituksessa ei ole eristyneisuusanomalioita. Lukituskäytännössä ajoitus onkin mahdollinen. 7 Harjoitus 7 1. Siivotaan p pois puskurista viemättä p:tä levylle ja naulitaan ja kirjoitussalvataan p (tämän pitää olla puskurinhallitsimen tuntema operaatio). Siis tuodaan p:n levyllä oleva versio puskuriin. Toistetaan lokin perusteella kaikki p:lle tulleet päivitykset, joiden LSN on suurempi kuin PageLSN(p). Siis ARIES-algoritmin toistovaihe yksinomaan sivulle p suoritettuna. Näin sivulle p saadaan ne päivitykset, jotka sillä oli ennen virheeseen keskeytyneen päivityksen alkamista. Sitten keskeytetään ja peruutetaan T normaaliin tapaan. Toinen, mutta turhan raaka tapa olisi kaataa koko järjestelmä ja suorittaa ARIES-algoritmi normaaliin tapaan kuten häiriöstä elvyttäessä. 2. Tarkastellaan ensin tapausta, jossa rakennemuutos esiintyy transaktion T etenemisvaiheessa. Rakennemuutoksen alkaessa pannaan muistiin m=lastlsn(t). Rakennemuutoksen viimeisen lokikirjauksen jälkeen asetetaan transaktiotaulussa LastLSN(T):= m. Esim. T lisää kasaan kaksi tietuetta, joista jälkimmäisen lisäys aiheuttaa uuden sivun varauksen kasaan: 100:... 101: < T, I, p, i, x, v, 100 > 102: < T, allocate-page-for-heap, f, p, q, LastLSN = 101 > 103: < T, I, q, j, y, w, 101 > 104:... Tarkastellaan sitten tapausta, jossa rakennemuutos esiintyy keskeytyneen transaktion T peruutusvaiheessa, kun etenemisvaiheessa tehty ja lokiin tietueella < T, D, p, i, x, v, n > kirjattu operaatio D[x,v] joudutaan perumaan loogisesti, koska sivulla p ei enää ole tilaa monikon (x,v) palautukselle. 16

110:... 111: < T, allocate-page-for-heap, f, p, q, LastLSN = 110 > 112: < T, undo(d), q, 1, x, v, n > 113:... Siis peruutusvaiheen aikana suoritetut rakennemuutokset kirjataan kuten etenemisvaiheessa. 3. a) Haetaan avaimen (10,20) peittävä ISAM-rakenteen lehtisivu p ja lisätään tietue (10,20,30, xyz ) soluun p kuten luennoilla on esitetty. Olkoon i tietueen monikkotunniste. Lisätään tietue (30,i) hajautushakemistoon luennoilla esitetyllä algoritmilla, paitsi ettei mitään lukkoja varata. Kysely saadaan yhdisteenä kahdesta kyselystä: select * from R where A = 25 and 300 B and B 400 union all select * from R where C = 50 and not (A = 25 and 300 B and B 400) Edellinen select-kysely lasketaan ISAM-hakemistoa käyttäen ja jälkimmäinen kysely hajautushakemistoa käyttäen. Kyselyssä ei voi hyödyntää hakemistoja, vaan relaation r ISAM-rakenteen lehtisivut (solut) selataan vasemmalta oikealle. Kysely voidaan ratkaista tehokkaimmin käymällä läpi ainoastaan tiheä oheishakemisto (hajautushakemisto). Relaatio r S-lukitaan. r:n monikoita ei ole tarpeen hakea esille. 4. Hyvänä puolena on, että r:n monikon monikkotunnisteen muuttuminen (esim. sivulta toiselle siirron vuoksi) ei vaadi mitään muutosta r:n oheishakemistoihin. Lisäksi useammat kyselyt voidaan ratkaista pelkästään hakemistoa käyttäen. Huonona puolena on, että tietueen hakupolku oheishakemiston kautta on yhtä pitempi kuin muutoin: oheishakemiston lehtisivulta saadaan vasta haettavan tietueen yksilöivä avain, jota käyttäen on vielä kuljettava harvan hakemiston polku juuresta itse tietueen sisältävälle sivulle. 5. Merkitään: rl(p) = fix(p) + read-latch(p). wl(p) = fix(p) + write-latch(p). ul(p) = unlatch(p) + unfix(p). B 1 : Kirjataan lokiin: 100: < T 1, B > R 1 [x, 12, v]: rl(p 1 ); rl(p 3 ); ul(p 1 ); rl(p 6 ); ul(p 3 ); S-lock(12); ul(p 6 ). I 1 [14, v 2 ]: X-lock(14); rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 6 ); ul(p 3 ); rl(p 7 ); X-lock(15); wl(0). Kirjataan lokiin: 101: < allocate-page-for-bucket, p 6, p 6, q >; ul(0). Kirjataan lokiin: 17

102: < T 1, I, q, 1, 14, v 2, 100 >; ul(p 6 ); ul(q); ul(p 7 ); unlock(15). I1[13, v 3 ]: X-lock(13); rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 6 ); ul(p 3 ); wl(q). Kirjataan lokiin: 103: < T 1, I, q, 2, 13, v 3, 102 >; ul(p 6 ); ul(q). B 2 : Kirjataan lokiin: 104: < T 2, B > I2[8, u ]: X-lock(8); rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 6 ); ul(p 3 ); wl(q); X-lock(9). Kirjataan lokiin: 105: < T 2, I, q, 3, 8, u, 104 >; ul(p 6 ); ul(q); unlock(9). A 1 : Kirjataan lokiin: 106: < T 1, A > undo(i 1 )[13, v 3 ] : wl(q); kirjataan lokiin: 107: < T 1, undo(i), q, 2, 102 >; ul(q). undo(i 1 )[14, v 2 ] : wl(q); kirjataan lokiin: 108: < T 1, undo(i), q, 1, 100 >; ul(q). C 1 : Kirjataan lokiin: 109: < T 1, C >; pakotetaan loki levylle; unlock(14); unlock(13); unlock(12). D 2 [12, v]: X-lock(12); rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 6 ); ul(p 3 ); wl(q); rl(p 7 ); X-lock(15); kirjataan lokiin: 110: < T 2, D, p 6, 4, 12, v, 105 >; ul(p 6 ); ul(q); ul(p 7 ); unlock(12). C 2 : Kirjataan lokiin: 111: < T 2, C >; pakotetaan loki levylle; unlock(8); unlock(15). 6. Kun transaktio T kulkee hakupolun jotain operaatiotaan (R, I, D, W) varten, se laittaa muistiin vastaisen varalle hakupolun viimeisen sivun p tunnisteen, avainten alarajan low-key(p) ja ylärajan high-key(p) sekä (päivityksen jälkeisen) PageLSN:n. Mikäli seuraavaksi suoritettavan T:n operaation hakuavain z sijoittuu välille low-key(p) z < high-key(p), yritetään naulita ja lukusalvata (R) tai kirjoitussalvata (I, D, W) sivu 18

p. Mikäli tämä onnistui ja sivun PageLSN on entisensä, ollaan oikealla sivulla. Muutoin jos naulinta ja salpaus onnistuivat, mutta PageLSN on muuttunut, tutkitaan (sivun sisällöstä), onko sivu vielä kyseisen rakenteen lehtisivu ja sijoittuuko avain z sivun pienimmän avaimen ja suurimman avaimen väliin. Jos näin on, ollaan oikealla sivulla. Muutoin on avainta z haettava puun juuresta lähtien. Vielä paremmin: Talletetaan koko hakupolku p 1, p 2,..., p n juuresta p 1 lehteen p n, kunkin sivun p i low-key ja high-key ja PageLSN. Uudelleen salpausta yritetään alimmalle sivulle p i, jonka peittämä väli kattaa avaimen z. Mikäli ei onnistu, yritetään lähinnä ylemmältä sivulta, jne. Pahimmassa tapauksessa joudutaan lähtemään juuresta. 8 Harjoitus 8 1. Ei voi esiintyä, sillä T 3 :a generoiva prosessi pitää kirjoitussalvat rakennemuutoksen kohteina oleviin sivuihin, siis mm. juureen p 1, rakennemuutoksen loppuun asti. Loogista operaatiota undo(w )[x, u, v] suorittava T 1 joutuu odottamaan T 3 :n salvan vapautumista. 2. Merkitään: rl(p) = fix(p) + read-latch(p). wl(p) = fix(p) + write-latch(p). ul(p) = unlatch(p) + unfix(p). Varataan avaimeen 13 pitkäkestoinen X-lukko. wl(p 1 ); wl(p 3 ); wl(p 6 ); havaitaan, että hakupolun kaikki sivut pitää halkaista ja puuta korottaa; wl(0); varataan uudet sivut p 1 ja p 1; wl(p 1); wl(p 1); korotetaan puuta; kirjataan lokiin 101: < inc-height, p 1, p 1, 30, p 1, {(, p 2 ), (8, p 3 )}, {(30,...), (60,...)} >; Page-LSN(0)=101; Page-LSN(p 1 )=101; Page-LSN(p 1)=101; Page-LSN(p 1)=101; ul(0); ul(p 1 ); ul(p 1); wl(0); varataan uusi sivu p 3; wl(p 3); halkaistaan p 3 ; kirjataan lokiin 102: < split, p 1, p 3, 20, p 3, {(20, p 8 ), (25, p 9 )} >; Page-LSN(0)=102; Page-LSN(p 1)=102; Page-LSN(p 3 )=102; Page-LSN(p 3)=102; ul(0); ul(p 1); ul(p 3); wl(0); varataan uusi sivu p 6; wl(p 6); halkaistaan p 6 ; kirjataan lokiin 103: < split, p 3, p 6, 11, p 6, {(11, u), (12, v), p 7 } >; ul(0); ul(p 3 ); ul(p 6 ); rl(p 7 ); varataan avaimen 13 seuraajaan 15 lyhytkestoinen X-lukko. Lisätään monikko (13, v ) sivulle p 6 tietuepaikkaan 3; kirjataan lokiin 104: < T, I, p 6, 3, 13, v, 100 >; Page-LSN(p 6)=104; Last-LSN(T)=104; ul(p 6); ul(p 7 ); vapautetaan avaimen 15 lyhytkestoinen lukko. 3. Lapsilinkin lisäykseen on varauduttu varmistamalla, että isässä on tilaa, tarvittaessa halkaisemalla isä. Lapsilinkin poistoon on varauduttu järjestämällä, ettei isä alivuoda linkin poistosta, tarvittaessa yhdistämällä isä sisaruksensa kanssa tai tasaamalla tietueet sisarusten kesken. Jokainen rakennemuutos säilyttää B-puun eheyden. Koska jokainen 19

rakennemuutos on kirjattu yhteen ainoaan, yhdelle sivulle kokonaan mahtuvaan lokitietueeseen, tulee ARIES-algoritmin toistovaiheessa jokainen rakennemuutos joko kokonaan toistetuksi (jos lokikirjaus oli ehtinyt levylle) tai rakennemuutoksesta ei ole mitään jälkiä lokissa. 4. Suoritetaan tarvittavat rakennemuutokset avaimen hakupolun läpikäynnin yhteydessä ennakoivasti: Lisättävän avaimen peittävää sivua haettaessa kohdattu täysi sivu halkaistaan (täysi juuri aiheuttaa puun korotuksen). Poistettavan avaimen sisältävää sivua haettaessa kohdattu sivu, jossa on vain minimimäärä tietueita, yhdistetään tai tasataan sisaruksensa kanssa (juuren vajaus aiheuttaa puun madalluksen). Seuraavaan on merkitty ainoastaan salpojen varaukset ja vapautukset sekä tuotetut lokikirjaukset (muutoin samoin kuin tehtävässä 2). wl(p 1 ); wl(0); wl(p 1); wl(p 1); 101: < inc-height, p 1, p 1, 30, p 1, {(, p 2 ), (8, p3)}, {(30,...), (60,...)} > ul(0); ul(p 1 ); ul(p 1); wl(p 3 ); wl(0); wl(p 3); 102: < split, p 1, p 3, 20, p 3, {(20, p 8 ), (25, p 9 )} > ul(0); ul(p 1); ul(p 3); wl(p 6 ); wl(0); wl(p 6); 103: < split, p 3, p 6, 11, p 6, {(11, u), (12, v)} > ul(0); ul(p 3 ); ul(p 6 ); rl(p 7 ); X-lock(15); 104: < T, I, p 6, 3, 13, v, 100 > ul(p 6); ul(p 7 ). Huonona puolena ovat turhat rakennemuutokset. Esimerkiksi juuri halkaistaan, vaikka avaimen hakupolun jokin alempi sivu olisi vajaa. 5. Ratkaisu, kun epätasapainoisuuksia ei korjailla: Kirjataan lokiin 100: < T, B >. Varataan pitkäkestoinen X-lukko avaimeen 18. rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 6 ); ul(p 3 ); wl(p 7 ); ul(p 6 ). Havaitaan, että p 7 pitää halkaista; wl(0); varataan uusi sivu p 7; wl(p 7); halkaistaan p 7 ; kirjataan lokiin 101: < split, p 7, 17, p 7, {(17,...), (20, p 8 )} >; Page-LSN(0)=101; Page-LSN(p 7 )=101; Page-LSN(p 7)=101; ul(0); ul(p 7 ); rl(p 8 ). Varataan lyhytkestoinen X-lukko avaimen 18 seuraajaan 20. Lisätään monikko (18, u) sivulle p 7 tietuepaikkaan 3; kirjataan lokiin 102: < T, I, p 7, 3, 18, u, 100 >; Page-LSN(p 7)=102; ul(p 7); ul(p 8 ); vapautetaan avaimen 20 lyhytkestoinen lukko. Varataan pitkäkestoinen X-lukko avaimeen 22. rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 8 ); ul(p 3 ). Havaitaan, että sivu p 8 pitää halkaista; wl(0); varataan uusi sivu p 8; wl(p 8); halkaistaan p 8 ; kirjataan lokiin 20

103: < split, p 8, 24, p 8, {(24,...), (25, p 9 )} >; Page-LSN(0)=103; Page-LSN(p 8 )=103; Page-LSN(p 8)=103; ul(0); ul(p 8); rl(p 8). Varataan lyhytkestoinen X-lukko avaimen 22 seuraajaan 24. Lisätään monikko (22, v) sivulle p 8 tietuepaikkaan 3; kirjataan lokiin 104: < T, I, p 8, 3, 22, v, 102 >; Page-LSN(p 8 )=104; ul(p 8 ); ul(p 8); vapautetaan avaimen 24 lyhytkestoinen lukko. Kirjataan lokiin 105: < T, C > ja pakotetaan loki levylle. Vapautetaan avainten 18 ja 22 pitkäkestoiset lukot. Ratkaisu, kun tasapainoisuuksia korjaillaan (näkyviin merkitty ainoastaan ainoastaan salpojen varaukset ja vapautukset sekä tuotetut lokikirjaukset): 100: < T, B > rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 6 ); havaitaan, ettei p 3 :ssa ole p 7 :ään osoittavaa lapsilinkkiä; koska p 3 on täynnä, on se ensin halkaistava; ul(p 3 ); wl(p 3 ); wl(0); wl(p 3); 101: < split, p 3, 25, p 3, {(25, p 9 ), (, 0)} > ul(0); ul(p 3); 102: < add-link, p 3, 15, p 7 > ul(p 3 ); wl(p 7 ); ul(p 6 ); wl(0); wl(p 7); 103: < split, p 7, 17, p 7, {(17,...), (20, p 8 )} > ul(0); ul(p 7 ); rl(p 8 ); 104: < T, I, p 7, 3, 18, u, 100 > ul(p 7); ul(p 8 ); rl(p 1 ); rl(p 3 ); ul(p 1 ); wl(p 8 ); ul(p 3 ); wl(0); wl(p 8); 105: < split, p 8, 24, p 8, {(24,...), (25, p 9 )} > ul(0); ul(p 8); rl(p 8); X-lock(24); 106: < T, I, p 8, 3, 22, v, 102 > ul(p 8 ); ul(p 8); 107: < T, C > 9 Harjoitus 9 1. LINEITEM-relaation OrderNr-hakemisto on kasautuva, muut hakemistot ovat hajautuvia. 21

a) 1 levyhaku. b) 10000/1000 = 10 levyhakua. c) 500+5000 = 5500 levyhakua (tiedostoselaus). Nr-hakemiston selaukseen perustuva ratkaisu veisi 10000 levyhakua. d) 1 levyhaku. e) 100000/200 = 500 levyhakua. f) 10000/1000 = 10 + 10 x (5000/10000) = 10 + 10 = 20 levyhakua. 2. Relaatiossa SALES on T = 500 x 10 x 300 x 5 = 7 500 000 monikkoa, jotka vievät vähintään B = T/150 = 50 000 ja enintään B = T/75 = 100 000 harvan B-puun lehtisivua. Kyselyt a, b ja c voidaan laskea tiheää hakemistoa käyttäen ja kyselyt d, e ja f harvaa hakemistoa käyttäen. Kustannukset (levyhakua): a) T/(500 x 5) = 3000. b) T/(500 x 5 x 12) = 250. c) T/(500 x 5 x 300) = 10. d) B/(10 x 5)... B /(10 x 5) = 1000... 2000. e) B/(10 x 5 x 12)... B /(10 x 5 x 12) = 84... 167. f) B/(10 x 5 x 300)... B /(10 x 5 x 300) = 4... 7. 3. Ehto (A = a 1 B b) (A a 2 C = c) hajotetaan kahdeksi ehdoksi: A = a 1 B b. A a 2 C = c (A = a 1 B b). Edellinen on jo konjunktiomuodossa. Jälkimmäinen sievennetään: A a 2 C = c (A a 1 B = b). Tämä on ekvivalentti seuraavan kanssa: A a 2 C = c A a 1 A a 2 C = c B = b. Tämä hajotetaan kahdeksi ehdoksi: A a 2 C = c A a 1. A a 2 C = c B = b (A a 2 C = c A a 1 ). Edellinen on konjuntiomuotoa. Jälkimmäinen on ekvivalentti seuraavan kanssa: C = c B = b A = a 1. Lopputulos: select * from R where A = a 1 and B! = b union all select * from R where A! = a 2 and C = c and A! = a 1 union all select * from R where C = c and B = b and A = a 1. 4. a) Tauluselaus, projektio A:lle ja järjestäminen. Mikäli A:n arvojoukko on pieni, pidetään yllä frekvenssilaskureita keskusmuisissa. 22

b) Harvan hakemiston lehtitason selaus. c) Tiheän hakemiston lehtitason selaus. Ei ole tarpeen kurkistaa itse relaatioon. 5. M = 50, C = 8, S = 10ms, r = 5ms, t = 0, 4ms. Lukuun ja kirjoitukseen tarvitaan 2 kertaa. Eriä on 200 kpl. Eli tehdään 48 ryväslukua ja 2 normaalia lukua. Eli ryvästetyt luvut vievät: (6 x ( 10 + 5 + 8 x 0,4))ms. Loput vievät: (10 + 5 + 2 x 0,4) ms. Eli Vaiheessa 1 tuotetaan 200 kpl 50 sivun eriä. Kustannus: 2 x 200 x (6 x (10 + 5 + 8 x 0,4) + 10 + 5 + 2 x 0,4) = 2 x 200 x (6 x 18,2 + 15,8) = 2 x 200 x (109,2 + 15,8) = 2 x 200 x 125 = 2 x 25000 ms = 50 s. Vaiheessa 2 lomitetaan kerrallaan aina F = 5 kpl 50-sivuisia eriä 250 sivun eriksi. Yhden lomituksen kustannus: 5 x 125 + (31 x 18,2 + 15,8) = 625 + 580 = 1205 ms. Tässä 31 = 248/8. Lomituksia tehdään kaikkiaan 40 kpl. Vaiheen 2 kokonaiskustannus on siis 40 x 1205 = 48200 ms = 48,2 s. Vaiheessa 3 lomitetaan kerrallaan aina F = 5 kpl 250-sivuisia eriä 1250 sivun eräksi. Yhden lomituksen kustannus: 5 x 580 + (156 x 18,2 + 15,8) = 2900 + 2855 = 5755 ms. Tässä 156 = 1248/8. Lomituksia tehdään kaikkiaan 8 kpl. Vaiheen 3 kokonaiskustannus on siis 8 x 5755 = 46040 ms = 46,0 s. Vaiheessa 4 lomitetaan 4 kpl 1250-sivuisia eriä 5000 sivun eräksi ja toiset 4 kpl 1250-sivuisia eriä 5000 sivun eräksi. Vaiheen 4 kustannus on 2 x (4 x 2855 + (625 x 18,2)) = 2 x (11420 + 11375) = 45590 ms = 45,6 s. Tässä 625 = 5000/8. Vaiheessa 5 lomitetaan 2 kpl 5000 sivun eriä yhdeksi 10000 sivun eräksi. Vaiheen 5 kustannus on: 2 x 11375 + 1250 x 18,2 = 22750 + 22750 = 45500 ms = 45,5 s. Tässä 1250 = 10000/8. Yhteensä: 50 + 48,2 + 46 + 45,6 + 45,5 = 235,3 s = noin 4 min. Vielä vähän parempi aika saataisiin, jos käytettäisiin puskurin kokoa 48, joka jakaantuu tasan 8:lla (toisin kuin 50). Vrt. että ryvästämätön lomitus vei 15,4 min. 10 Harjoitus 10 1. r(a, B), s(b, C), r s, r.b s.b, I r.b I s.b. Valitaan T r = T S = 6, I r.b = 2 ja I s.b = 3. Tällöin T r Ts I s.b = Tr Ts I s.b = 6 6 = 12. 3 a) r(ab) = {11, 21, 31, 12, 22, 32}. s(bc) = {11, 12, 21, 22, 31, 32}. Jolloin r s = {111, 112, 211, 212, 311, 312, 121, 122, 221, 222, 331, 322}. Eli 12 monikkoa. b) r(ab) = {11, 21, 31, 41, 51, 12}. s(bc) = {11, 12, 13, 14, 21, 31}. Jolloin r s = {111, 112, 113, 114, 211, 212, 213, 214, 311, 312, 313, 314, 411, 412, 413, 414, 511, 512, 513, 514, 121}. Eli 21 monikkoa. Tai: r(ab) mikä tahansa, mutta s(bc):n B-sarakkeessa on 1, 2, 3, 3, 3, 3. 23

2. Merkitään: E = EMPLOYEE, W = WORKS-ON, P = PROJECT. T E = 1000. T W = 2 x T E = 2000. T P = T W / 20 = 100. B E = 1000 / (4000/400) = 1000 / 10 = 100. W-monikko on korkeintaan 11 + 4 + 4 + 1 = 20 tavua. B W = 2000 / (4000/20) = 2000 / 200 = 10. B P = 100 / (4000/200) = 100 / 20 = 5. I ESSN = I SSN = T E. I P rnr = I Nr = T P. Merkitään Q = E SSN=ESSN W P rnr=nr P. Tehtävänä on arvioida B Q. Ratkaisu 1: Q-monikko on 400 + 20 + 200 = 620 tavua. Liitoksessa on T Q = T W = 2000 monikkoa ja B Q = T W / (4000/620) = 2000 / 6 = 334 sivua. Ratkaisu 2: Merkitään R = E SSN=ESSN W, jolloin Q = R P rnr=nr P. T R = T E x T W /I SSN = 1000 x 2000 / 1000 = 2000. B R = (B E x T W + T E x B W ) / I SSN = (100 x 2000 + 1000 x 10) / 1000 = 210. B Q = (B R x T P + T R x B P ) / I Nr = (210 x 100 + 2000 x 5) / 100 = 310 sivua. 3. T r = 10000, B r = 500, T r /B r = 20, I r.b = 100. T s = 1000, I s.b = 100. Hakemistoliitoksen syötekustannus: B r + T r x T s / I s.b = 500 + 10000 x 10 = 100500. Järjestäen r ensin (kun M = 10): 2 B r log M B r + B r + I r.b x T s / I s.b = 2 x 500 x 3 + 500 + 100 x 10 = 3000 + 500 + 1000 = 4500. 4. a) Välitulosten materialisaatioihin perustuva laskenta: 1. R1:= Π Givenname,SSN (σ Surname= Smith (EMP lasketaan EMPLOYEE-relaation harvan B-puurakenteen avulla. 2. R2:= Π Givenname,P rnr (R1 SSN WORKS-ON) lasketaan hakemistoliitoksena. 3. R3:= Π Givenname,Name (R2 P rnr=nr σ StartDate> 1999-01-01 (P ROJECT )) lasketaan hakemistoliitoksena. Putkitusta voidaan käyttää eliminoimaan välitulosten R1 ja R2 materialisaatiot. Operaatio 1 putkittaa tulosmonikoitaan operaatiolle 2, joka voi tuottaa heti liitosmonikoita ja putkittaa niitä operaatiolle 3. Operaatio 3 puolestaan voi tuottaa tulosmonikoita sitä mukaa kuin se saa syötettä operaatiolta 2. 5. Tässä ei pidä kaikkia valintoja suorittaa ensin. Pyritään välttämään isojen olioiden, tässä tapauksessa kuvien, hakua levyltä sekä kalliiden funktioiden laskentaa. Relaatio WEEK on mitättömän pieni. Valitaan siitä tauluselauksella helmikuun viikot, jolloin saadaan 4 viikkonumeroa (Nr). Näillä suoritetaan haku relaatioon MAP sen WeekNro-hakemiston avulla. Valitaan mukaan ne MAP-monikot m, joille m.channel = 4. Näille haetaan esiin m.picture ja lasketaan snowcoverage(m.picture). Edullinen olisi tiedostorakenne, jossa MAP-monikoiden Picture-attribuuttien arvot on sijoitettu eri tiedostoon. MAP-monikon attribuutissa Picture olisi vain Picture-olion tunniste, jolloin vältytään tarpeettomilta isojen olioiden hauilta. 6. Muunnos on mahdollinen, kun B on relaation s yksilöivä avain. Jos näin ei ole, jälkimmäinen kysely voi antaa enemmän monikoiden kaksoiskappaleita kuin edellinen. Jos sitä vastoin ulompi kysely olisi select distinct -muotoa, olisivat kyselyt aina ekvivalentit. Muunnos on hyödyllinen siksi, että se mahdollistaa useampia erilaisia laskentastrategioita. Esim. hakemistoliitos, jossa r on ulompi ja s sisempi relaatio, tai päinvastoin. 24