Helsingin Yliopisto, Tietojenkäsittelytieteen laitos Tietokannan hallinta, kurssikoe 14.5.2004, J. Lindström Ratkaisuehdotuksia 1. Hakemistorakenteet, 15p. Tutkitaan tyhjää B+-puuta, jossa jokaiselle hakemistosivulle ja lehtisivulle mahtuu (2..4) avainta. (a) Piirrä näkyviin kuinka puuta muokataan kun puuhun lisätään avaimet 6,, 9,, 51, 1, 16, 22, 3, 2, 4, 7, 5, 10, 14, 44, 11, ja 8. Piirrä välivaiheita näkyviin ainakin kun sivuja halkaistaan tai puun korkeus kasvaa. 8p. Lisätään avainarvot 6,, 9 ja, jotka kaikki mahtuvat juuritasolle: 6 9 Lisätään avainarvo 51, joka aiheuttaa juuritason (= lehtitaso) halkeamisen. Luodaan uusi solmu ja jaetaan avainarvot solmujen kesken. Kopioidaan uuden solmun pienen arvo hakemistotasolle viitaksi (avainarvo ): 6 9 51 Lisätään avainarvo 1, joka mahtuu lehtitasolle: 1 6 9 51 Lisätään avainarvo 16, joka aiheuttaa lehtitason halkeamisen. Luodaan uusi solmu ja jaetaan avainarvot solmujen kesken. Kopioidaan uuden lehtisolmun pienin arvo ylemmälle tasolle viitaksi (avainarvo ): 1 6 9 16 51 1
Lisätään avainarvot 22 ja 3, jotka molemmat mahtuvat lehtitasojen sivuille: 1 3 6 9 16 22 51 Lisätään avainarvo 2, joka aiheuttaa lehtitason halkeamisen. Luodaan uusi solmu ja jaetaan avainarvot solmujen kesken. Kopioidaan uuden lehtisolmun pienin arvo ylemmälle tasolle viitaksi (avainarvo 6): 6 1 2 3 6 9 16 22 51 Lisätään avainarvot 4 ja 7 jotka mahtuvat lehtitasolle: 6 1 2 3 4 6 7 9 16 22 51 Lisätään avainarvo 5, joka aiheuttaa lehtitason halkeamisen. Luodaan uusi solmu ja jaetaan avainarvot solmujen kesken. Kopioidaan uuden lehtisolmun pienin arvo ylemmälle tasolle viitaksi (avainarvo 4): 4 6 1 2 3 4 5 6 7 9 16 22 51 Lisätään avainarvot 10, 14 ja 44 jotka mahtuvat lehtitasolle: 4 6 1 2 3 4 5 6 7 9 10 22 44 51 Lisätään avainarvo 11, joka aiheuttaa lehtitason halkeamisen. Luodaan uusi solmu ja jaetaan avainarvot solmujen kesken. Kopioidaan uuden lehtisolmun pienin arvo 2
ylemmälle tasolle viitaksi (avainarvo 10), mutta huomataan ettei se mahdu ylemmälle hakemistotasolle (tässä tapauksessa juuritaso): 4 6 1 2 3 4 5 6 7 9 10 11 14 16 22 44 51 Joten halkaistaan myös hakemistotaso. Luodaan uusi solmu ja jaetaan avainarvot solmujen kesken. Koska jaettavana oli juuritaso, luodaan uusi juuri. Siirretään uuden hakemistosivun pienin arvo juuritasolle (huomaa ettei kopioida!): 10 4 6 1 2 3 4 5 6 7 9 10 11 22 44 51 Lisätään avainarvo 8, joka mahtuu lehtitasolle ja puu on valmis: 10 4 6 1 2 3 4 5 6 7 8 9 10 11 22 44 51 (b) Miten näin saadusta puusta haettaisiin avainarvoa 9? 2p. Verrataan hakuavainta 9 juuritason ensimmäiseen avaimeen. Koska 9 < 10 seurataan vasemmanpuolista osoitinta puun vasemmalle puolelle. Verrataan hakuavainta 9 hakemistotason viittaan 4. Koska 9 > 4 jatketaan hakemistotason viittojen vertailua. Verrataan hakuavainta 9 hakemistotason viittaan 6. Koska 9 > 4 jatketaan hakemistotason viittojen vertailua. Havaitaan ettei hakemistotasolla ole enempää avaimia, joten seurataan viimeistä osoitinta alaspäin (oikealle). Päädytään lehtitasolle. Verrataan hakuavainta 9 ensin avainarvoon 6. Koska 6 9, jatketaan vertailua seuraavasta arvosta. Koska 7 9, jatketaan vertailua seuraavasta arvosta. Koska 9 = 9 avain on puussa. Palautetaan avain ja siihen liittyvä osoitin. (c) Piirrä näkyviin kuinka puuta muokataan kun (a)-kohdasta saadusta puusta poistetaan avaimet: 3, 2, 1, 6, 5, 8, 7 ja 4. Piirrä välivaiheita näkyviin ainakin kun sivuja yhdistellään tai puun korkeus laskee. 5p. Poistetaan avainarvo 3, poisto ei aiheuta lehtitason alivuotoa: 3
10 4 6 1 2 4 5 6 7 8 9 10 11 22 44 51 Poistetaan avainarvo 2, joka aiheuttaa lehtitason alivuodon. Koska vasemmanpuolisen veljen ja käsittelyssä olevan solmun avainten lukumäärä on vähemmän tai yhtäsuuri kuin solmun avainten maksimimäärä, yhdistetään solmut. Tyhjäksi jäänyt solmu poistetaan puusta, jolloin myös hakemistotasolla oleva viitta poistetaan (avainarvo 4): 10 6 1 4 5 6 7 8 9 10 11 22 44 51 Havaitaan että hakemistosivukin alivuotaa. Vasemmanpuolisesta veljestä ei voida lainata, koska sekin alivuotaisi lainauksen yhteydessä. Joten pitää yhdistää. Koska yhdistys poistaisi yhden viitan juuritasolta, juuritasokin alivuotaisi. Joten hakemistotaso ja juuritaso pitää yhdistää ja puun korkeus laskee: 6 10 1 4 5 6 7 8 9 10 11 22 44 51 Poistetaan avainarvo 6, joka ei aiheuta lehtitason alivuotoa (huomaa ettei viittaa tarvitse korjata): 6 10 1 4 5 7 8 9 10 11 22 44 51 Poistetaan avainarvot 5, jotka ei aiheuta lehtitason alivuotoa: 4
6 10 1 4 7 8 9 10 11 22 44 51 Poistetaan avainarvo 8, joka ei aiheuta lehtitason alivuotoa: 6 10 1 4 7 9 10 11 22 44 51 Poistetaan avainaro 7, joka aiheuttaa lehtitason alivuodon. Koska vasemmanpuolisen veljen ja käsittelyssä olevan solmun avainten lukumäärä on vähemmän tai yhtäsuuri kuin solmun avainten maksimimäärä, yhdistetään solmut. Tyhjäksi jäänyt solmu poistetaan puusta, jolloin myös hakemistotasolla oleva viitta poistetaan (avainarvo 6). Huomaa että hakemistotason viitta 10 pitää korjata: 9 1 4 9 10 11 22 44 51 Poistetaan avainarvo 4, joka aiheuttaa lehtitason alivuodon. Koska vasemmanpuolisen veljen ja käsittelyssä olevan solmun avainten lukumäärä on vähemmän tai yhtäsuuri kuin solmun avainten maksimimäärä, yhdistetään solmut. Tyhjäksi jäänyt solmu poistetaan puusta, jolloin myös hakemistotasolla oleva viitta poistetaan (avainarvo 9): 1 9 10 11 22 44 51 Puu on valmis! 5
2. Elvytys, 15p. Oletetaan että lokin sisältö romahduspisteessä on seuraava: 108: < start, T 3 > 109: < start, T 4 > 110: < write, T 3, B, 11, 33 > 111: < write, T 4, A, 30, 35 > 1: < write, T 4, C, 15, 25 > 113: < write, T 3, A, 35, 40 > 114: < commit, T 3 > 115: < write, T 4, C, 25, 35 > Mitä operaatioita sisältyy tästä tilanteesta alkavaan elvytykseen? Kuvaa elvytyksen eri vaiheet ja listaa konkreettisesti tehtävät operaatiot perustellen miksi ne operaatiot tehtiin ja miksi joitain operaatioita jätettiin tekemättä. Oletetaan, että tietoalkion A sisältävän sivun P agelsn = 111, tietoalkion B sisältävän sivun P agelsn = 110 ja tietoalkion C sisältävän sivun P agelsn = 1. Oletetaan että lokimerkinnät ovat muotoa < operaatio, transaktio, tietoalkio, alkukuva, loppukuva > Toipuminen aloitetaan lukemalla lokia alusta loppuun ja muodostetaan kaksi transaktiolistaan. Keskeytyneet-listaan kerätään ne transaktiot joille lokissa on start merkintä mutta ei commit merkintää eika abort merkinää ennen viimeistä checkpoint merkintää. Sioutuneetlistaan kerätään ne transaktiot joille lokissa on commit merkintä viimeisen checkpoint merkinnän jälkeen. Tehtävässä viimeinen chekpoint on ennen kaikkia operaatioita. Eli tehtävässä keskeytyneet = {T 4 } ja sitoutuneet = {T 3 }. Tämän jälkeen aloitetaan undo-vaihe, jossa keskeneräisten transaktioiden suorittamat muutokset perutaan lukemalla lokia lopusta alkuun. Tässä pitää huomioida PageLSN:t. Rivillä 115 olevaa kirjoitusta ei tarvitse perua, sillä C:n sisältävän sivun P agelsn = 1 < 115, eli rivillä 115 tehtyä muutosta ei vielä oltu kirjoitettu levylle asti. Rivin 1 kirjoutus joudutaan peruuttamaan eli suoritetaan operaatio < write, C, 15 > ja tehdään lokikirjaus 116 :< write, T 4, C, 25, 15 >. Rivin 111 kirjoitus joudutaan peruuttamaan eli suoritetaan operaatio < write, A, 30 > ja tehdään lokikirjaus 117 :< write, T 4, A, 35, 30 >. Lopuksi merkitään lokiin transaktion peruutus 118 :< abort, T 4 >. Tämän jälkeen aloitetaan redo-vaihe, jossa sitoutuneiden transaktioiden tekemät muutokset suoritetaan uudestaan käymällä lokia alusta loppuun. Huomioidaan taas PageLSN:t. Rivin 110 kirjoitusta ei uusita sillä B:n sisältävän sivun P agelsn = 110 = 110. Rivin 113 kirjoitus joudutaan uusimaan sillä A:n sisältävän sivun P agelsn = 111 < 113. Joten suoritetaan kirjoitus < write, A, 40 > ja tehdään lokikirjaus 119 :< write, A, 35, 40 >. Lopuksi otetaan vielä checkpoint ja tehdään lokikirjaus 0 :< checkpoint >. 3. Kyselynkäsittely, 15p. Olkoon annettuna seuraava relaatiokaavio ja SQL-kysely. Rengastus(rengasnro: integer,laji: char(6), paiva: date); - avaimena rengasnro 6
Havainnot(id: integer, trengasnro: integer, tarkkapaikka: char(80),tkuntaid: integer,tpaiva: date); - avaimena id, trengasnro on viiteavain tauluun Rengastus ja tkuntaid viiteavain tauluun Kunta. Kunta(kuntaid: integer,kunta nimi: char(40)); - avaimena kuntaid. SELECT R.paiva, R.laji, T.tpaiva, T.tarkkapaikka, K.kunta nimi FROM Rengastus R, Havainnot T, Kunta K WHERE R.laji = SLOKKI AND T.trengasnro = R.rengasnro AND K.kuntaid = T.tkuntaid; (a) Anna kyselyä vastaava optimoimaton projektio-valinta-tulomuotoinen relaatioalbegran lauseke ja piirrä sitä vastaava kyselypuu. 4p. σ R.laji= SLOKKI T.trengasnro=R.rengasnro K.kuntaid=T.kuntaid ( R T K)) Kyselypuu olisi: projektio R.paiva, R.laji, T.tpaiva, T.tarkkapaikka, K.kunta_nimi valinta R.laji = "SLOKKI" AND T.trengasnro = R.rengasnro AND K.kuntaid = T.tkuntaid; X X R T K 7
(b) Optimoi kyselyä heuristisilla säännöillä kirjoittaen näkyviin sekä miten kyselyä olet muokannut että mihin sääntöön muokkaus perustuu ja piirrä näkyviin optimoitua kyselyä vastaava kyselypuu. 7p. σ R.laji= SLOKKI T.trengasnro=R.rengasnro K.kuntaid=T.kuntaid ( R T K)) (2) σ R.laji= SLOKKI (σ T.trengasnro=R.rengasnro (σ K.kuntaid=T.kuntaid ( R T K)))) (3) σ R.laji= SLOKKI (σ T.trengasnro=R.rengasnro ( (R) (σ K.kuntaid=T.kuntaid (T K))))) (5) σ R.laji= SLOKKI (σ T.trengasnro=R.rengasnro ( (R) (T K.kuntaid=T.kuntaid K)))) (3) σ T.trengasnro=R.rengasnro (σ R.laji= SLOKKI (R) (T K.kuntaid=T.kuntaid K))) (5) (σ R.laji= SLOKKI (R) T.trengasnro=R.rengasnro (T K.kuntaid=T.kuntaid K))) Kyselypuu olisi: 8
projektio R.paiva, R.laji, T.tpaiva, T.tarkkapaikka, K.kunta_nimi liitos K.kuntaid = T.tkuntaid; liitos T.trengasnro = R.rengasnro T K valinta R.laji = "SLOKKI" R (c) Kerro kuinka suorittaisit kyselyn, jos jokaisesta relaatiosta tiedetään että se talletettu järjestämättömään kasarakenteeseen peräkkäistalletuksella. Mitkä hakemistot nopeuttaisivat kyselyn suoritusta? 3p for all r in R if r.laji = "SLOKKI" then for all t in T if t.trengasnro = r.rengasnro then for all k in K if K.kuntaid = T.kuntaid then output r.paiva, r.laji, t.tpaiva, t.tarkkapaiva, k.kuntanimi; end if end for end if end for end if end for Kyselyä nopeuttaisivat hakemistot kenttiin R.laji, T.trengasnro ja K.kuntaid. (d) Kuinka monta riviä kysely palauttaisi tuloksenaan, jos tiedetään että Rengastustaulussa on 5000 riviä, Havainnot-taulussa 30000 riviä ja Kunta-taulussa 250 riviä. Eri lajeja on 10. Voit olettaa arvojen jakautuvan tasaisesti. 1p. 9
Yhteen rengastus riviin on keskimäärin 30000 = 6 havainto riviä. Rengastustaulussa lajien jakautuessa tasaisesti on 5000 = 500 riviä, joiden lajina on SLOKKI. 5000 10 Lajien jakautuessa tasaisesti kysely palauttaisi siis 6 500 = 3000 riviä. 4. Tapahtumankäsittely, 15p. (a) Anna esimerkki historiasta, joka on sarjallistuva mutta jota ei voi suorittaa täsmälleen samassa järjestyksessä tiukalla 2PL menetelmällä. 4p. H = r 1 [x]w 2 [x]r 1 [y]c 1 c 2 (b) Olkoon historia H = r 1 [x]r 2 [y]w 1 [y]w 2 [y]r 1 [z]w 1 [x]w 2 [z]c 1 c 2. Mitä eristyneisyysanomalioita historiassa esiintyy? Piirrä näkyviin historiaa vastaava sarjallistuvuusverkko ja perustele sen avulla onko historia konfliktisarjallistuva? 5p. Historia sisältää toistokelvottoman luvun r 1 [z] (koska w 2 [z]) ja häviävän kirjoituksen w 1 [y] (koska w 2 [y]). Historiaa vastaava sarjallistuvuusverkko olisi: r2[y] w1[y] T1 T2 w1[y] w2[y] r1[z] w2[z] Koska sarjallistuvuusverkko on syklinen historia ei ole sarjallistuva ja siis ei voi olla konfliktisarjallistuva. (c) Anna esimerkki historiasta, jossa esiintyy likainen luku. 2p. (Huom: kirjoita esimerkkiin näkyviin vain välttämättömät operaatiot ja perustele mikä operaatio aiheuttaa likaisen luvun). H = w 1 [x]r 2 [x], tässä r 2 [x] on likainen luku, koska transaktio lukee sitoutumattoman tietoalkion x. (d) Anna esimerkki historiasta, jossa käytetään tiukkaa 2PL-menetelmää ja jossa esiintyy lukkiutuma. Piirrä näkyviin odotusverkko (wait-for graph). 4p. 10
H = r 1 [x]r 2 [y]w 1 [y]w 2 [x]. Odotusverkko olisi: r1[x] w2[x] T1 T2 r2[y] w1[y] 11