Tentamen i Databasteknik Tisdagen den 15 mars 2010 Tillåtna hjälpmedel: Allt skrivet material och räknedosa Använd bara framsidan på varje blad. Skriv max en uppgift per blad. Motivera allt, dokumentera egna antaganden. Oläslig/obegriplig lösning ger noll poäng. Max 70 poäng av den totala examinationen + bonus max 30 poäng Betygsgränser : KTH+SU+FoV F+ 43 p E 50 p D 57 p C 64 p B 71 p A 78 p Lycka till! Kjell
Tentamen i Databasteknik 1. 15 p En skivaffär vill hålla reda på skivor och de låtar som ingår, artister och vilka instrument de spelar, skivbolag, distributörer i olika länder och artistgrupper (orkestrar) och använder ett register med följande attribut: ANamn, Instrument, Grupp, GÅr, Land, Distributör, Dfax, SkivTitel, SÅr, SkivBolag, Sfax, Pris, Låt Vi har följande information om attributen: ANamn Artistens namn Instrument De instrument artisten spelar Grupp Namnet på den grupp artisten tillhör GÅr Året då gruppen bildades Land Landet där skivan producerades Distributör Vem distribuerar skivan i ett visst land Dfax Distributörens faxnr SkivTitel Skivans titel SÅr Skivans utgivningsår SkivBolag Skivbolaget som ger ut skivan Sfax Skivbolagets faxnr Pris Skivans pris Låt Namnet på en låt En låt kan ingå i flera skivor (samlingsskivor) Och en artist kan ha tillhört flera grupper. En skiva kan ha olika distributörer i olika länder. a (4 p) b (3 p) c (8 p) Utred vilka funktionella beroenden som finns i strukturen. En första ansats är att lägga alla termer i en enda tabell. Vilka för och nackdelar har en sådan lösning i det aktuella fallet? Normalisera successivt till 1NF, 2NF, 3NF och motivera alla åtgärder. 2. 15 p Givet varuhusdatabasen med följande databasstruktur: Anställd ( ( namn ), lön, chef, avd ) Försäljning ( ( avd, varunr ), volym ) Leverantör ( ( företag ), adress ) Lager ( ( företag, avd, varunr ), volym ) Avdelning ( ( avd ), våning ) Vara ( ( varunr ), typ ) där varunr, våning och volym är av typen integer och övriga av typen VarChar(30). a (4 p) Översätt följande uttryck i relationsalgebra till SQL: tmp(företag, varunr) π företag, varunr, våning (Lager Vara) tmp1(f, t) π företag, typ (σ våning = 2 (Vara tmp)) tmp2 fg count(t) AS n (tmp1) π c (tmp2 (G max(n) as n (tmp2)))
Tentamen i Databasteknik b (5 p) Översätt följande SQL-fråga till ett relationsalgebrauttryck: create view tmp(företag, n) as select företag, count(avd) from Lager, Vara where Lager.varunr = Vara.Varunr and typ = (select typ from Vara where varunr = 13) group by företag; select företag from tmp where n = (select max(n) from tmp) c (6 p) Skriv SQL-frågor mot varuhusdatabasen som besvarar följande frågor: i På vilken våning ligger den avdelningen som säljer störst volym av damskor? ii Vilka arbetar på den avdelning som har minst medellön? 3. 15 p En databas innehåller följande tabell R(A, B, C) där A och B är heltal i [0, 10000] och C är en sträng med längden 150 tecken. Tabellen innehåller 1000000 tupler. A, B är den enda kandidatnyckeln. Blockstorleken är 2kByte. a (8 p) Följande fråga ställs: π C (σ A = 4711 (R)). Uppskatta antalet blockläsningar, i värsta och bästa fall, då vi i inte har något index ii har ett sammansatt B + -trädindex på AB. b (2 p) Lönar det sig att ha separata index på B och A i stället för ett sammansatt index? Vilken typ av index skall man i så fall ha på A resp B? c (5 p) Antag att vi vill evaluera följande fråga så snabbt som möjligt. π C (σ B > 1000 (R)). Hur skall detta göras? Vilka ev index bör definieras? Attribut och indextyp skall anges. 4. 5 p Beskriv hur databasen återställs efter krasch utgående från nedanstående systemlogg. Part of system log: Start-transaction T1 Write-item T1, A, 10, 20 Start-transaction T2 Commit T1 Write-item T2, B, 10, 30 Checkpoint Write-item T2, C, 10, 50 Start-transaction T3 Write-item T3, D, 20, 70 Commit T2 Write-item T3, C, 50, 30 system crash
Tentamen i Databasteknik 5. 10 p Givet nedanstående transaktioner: TRANSAKTION 1 read (A); read (B); A := A + 2000; B := B - 2000; write (A); write (B); commit; TRANSAKTION 2 read (B); B := B + 1000; write (B); commit; a. (4 p) Om vi har följande operationsföljd: start T1, read T1 (A), start T2, read T1 (B), read T2 (B), write T1 (A), write T2 (B), write T1 (B) Är operationsföljden serialiserbar? b. (3 p) Lägg till read-lock-, write-lock- och unlock-operationer i transaktionerna då man har tvåfaslåsnings med wait-die för deadlock hantering. c. (3 p) Visa vad som händer om man i stället för låsning använder tidsstämpling. 6. 10 p Följande fråga, formulerad i relationsalgebra, ställs mot varuhusdatabasen som växt. tmp π företag, våning (σ typ = tomat Vara.varunr = Lager.varunr Lager.avd = Avdelning.avd ( Vara Avdelning Lager) π företag (σ Våning = 2 (tmp)) Relationernas storlek i antal tupler är: Anställd 10000 Försäljning 70000 Leverantör 1000 Lager 120000 Vara 50000 Avdelning 50 Lön, våning, volym och varunr är heltal och resten av attributen är textsträngar med längden 30. Visa hur frågeoptimeraren optimerar frågan genom algebraisk omformulering. Visa både vilka olika optimeringar som görs, vilka algoritmer som används och vad slutresultatet blir.
Lösningsförslag till tentamen i Databasteknik Tisdagen den 15 mars 2010
Lösningsförslag till tentamen i Databasteknik 1. Antag att artistnamnen, distributörsnamn, skivtitel, gruppnamn och skivbolagsnamn är unika. Ett faxnr går bara till en distributör eller ett skivbolag. En skiva kan ha olika pris beroende på land. Vi använder Land till två saker: 1) hålla reda på skivbolagets landstillhörighet, 2) distributörens landstillhörighet. a Grupp GÅr Dfax Distributör Sfax SkivBolag, SLand SkivBolag SLand SkivTitel SÅr, Sfax SkivTitel, DLand Dfax, Pris b Fördelar: Lätt att förstå hur allt hänger ihop. Nackdelar: Uppdateringsproblem, Faxnr till ett skivbolag finns på många ställen och ett okänt antal tupler måste uppdateras om ett skivbolag byter faxnr. Insättningsproblem: om ett nytt skivbolag, som inte ännu gett ut någon skiva, skall registreras måste en del av nyckeln vara null (det räcker inte med Sfax som nyckel). Borttagningsproblem: Om ett skivbolag bara givit ut en skiva som bara distribueras av en distrubutör och den aktuella skivan tas bort så försvinner även informationen om skivbolaget. c Nyckel till relationen: ANamn, Instrument, Grupp, Dfax, SkivTitel, Sfax, Låt Vi får då 1NF: ((ANamn, Instrument, Grupp, Dfax, SkivTitel, Låt), GÅr, SLand, Distributör, DLand, SÅr, SkivBolag, Sfax, Pris) 2NF: Grupp GÅr ((Grupp), GÅr) Dfax Distributör ((Dfax), Distributör) Sfax SkivBolag, SLand ((Sfax), SkivBolag, SLand) SkivTitel SÅr, Sfax ((SkivTitel), SÅr, Sfax) SkivTitel, DLand Dfax, Pris ((SkivTitel, DLand), Dfax, Pris) Kvar blir då: ((ANamn, Instrument, Grupp, Dfax, SkivTitel, Låt)) 3NF: SkivBolag SLand ((Sfax), SkivBolag, SLand) delas i ((Sfax), SkivBolag) och ((SkivBolag), SLand) och då vi inte har några andra transitiva beroenden får vi: ((Grupp), GÅr) ((Dfax), Distributör) ((SkivTitel), SÅr, Sfax) ((SkivTitel, DLand), Dfax, Pris) ((Sfax), SkivBolag) ((SkivBolag), SLand) ((ANamn, Instrument, Grupp, Dfax, SkivTitel, Låt)) Detta kontrolleras genom reverse-engineering och vi konstaterar att:
Lösningsförslag till tentamen i Databasteknik ((Grupp), GÅr) ((Dfax), Distributör) ((SkivTitel), SÅr, Sfax) ((SkivTitel, DLand), Dfax, Pris) ((Sfax), SkivBolag) ((SkivBolag), SLand) ((Låt, SkivTitel)) ((Dfax, SkivTitel)) ((ANamn, Instrument)) ((ANamn, SkivTitel, Låt)) Blir bättre. 2. a b c i Översätt följande uttryck i relationsalgebra till SQL: create view tmp as select företag, varunr, våning from Lager natural join Vara natural join Avdelning; create view tmp1(f, t) as select företag, typ from Vara natural join tmp where våning = 2; create view tmp2 as select f, count(t) as n from tmp1 group by f; select f from tmp2 natural join (select max(n) as n from tmp2) as t; tmp1 π typ (σ varunr = 13 Vara) tmp(företag, n) företag G count(avd) (Lager Vara tmp1) π företag (tmp G max(n) (tmp)) create view tmp as select avd, sum(volym) as n from försäljning group by avd; select våning from avdelning natural join (select avd from tmp natural join (select max(n) as n from tmp)) ii create view tmp as select avd, avg(lön) as mlön from anställd group by avd; select namn from anställd natural join (select avd from tmp natural join (select max(mlön) as mlön from tmp)) 3. a i Varje tupel är 4 + 4 +150 = 158 byte. Vi får då plats med 2048/158 = 12 tupler per block. Eftersom vi söker tupler för ett visst A-värde och kan ha 10000 olika B-värden så I värsta fall måste vi läsa igenom hela relationen: 1000000/12 = 83334 block i bästa fall ligger alla intressanta tupler i början av relationen och vi har A=4711 i kombination med 10000 olika B-värden. Vi kan då bruta evalueringen då vi läst 10000 tupler. Vi behöver då läsa 10000/12 = 834 block
Lösningsförslag till tentamen i Databasteknik ii Vi kan matcha på A-värdet och eftersom relationen är sorterad efter nyckeln så ligger alla 10000 B-värden efter varandra (relationen är sorterad i första hand på A i andra hand på B) så vi måste läsa 834 block från datafilen + B + -trädet. B-trädet: nyckeln tar upp 8byte och vi har en pekare på 4 byte. Varje post i B-trädet tar 12 byte. Vi får plats med (2048-4)/12 = 170 indexposter i varje block. På första nivån i trädet har vi 170 nycklar. På andra nivån i trädet har vi 171*170=28900 nycklar. På tredja nivån i trädet har vi (28900+171)*170=4942070 nycklar. Det räcker m a o med tre nivåer i indexfilen. I bästa och värsta fall behöver vi läsa 3+834 block. b c Nej vid den aktuella sökningen matchar vi på A (första delen i index) och behöver då läsa 3 block i indexfilen. Om vi har ett separat index på A blir trädet bara 2 högt och vi tjänar ett block men det är försumbart. Vi behöver ett index på B + och hashindex duger inte eftersom vi har en intervallfråga. Vi skall ha ett B-trädsindex på B. 4. Läs loggen bakifrån och gör två listor: Redo och Undo. I redo-listan noterar vi alla transaktioner som gjort commit. Då vi kommer till checkpoin-posten lägger vi alla transaktioner, som inte finns i redolistan, i undo-listan. Redo: T2 Undo: T3 Checkpoin tvingar ut alla databasbuffertar så redo behöver bara göras från checkpoin och frammåt: Kolla C-värdet om det är 10 så skriv 50 till databasen sedan är T2 klar. Gå till loggens slut och gör undo på T3: Om C är 30 så skriv 50 till databasen. Om D är 70 så skriv 20 till databasen. Fortsätt att backa i loggen tills start för T3 hittas då är vi klara. 5. a. read T1 (A), read T1 (B), read T2 (B), write T1 (A), write T2 (B), write T1 (B) Vi har konflikt m a p operationerna: read T1 (B), write T2 (B) read T2 (B), write T1 (B) write T2 (B), write T1 (B) Vi ritar en serialiserbarhetsgraf och ser då att vi får en cykel så operationsföljden är inte serialiserbar. b. Antag att T1 startar vid tiden 10 och T2 vid tiden 20. T1(10) D-lås, ok read(a) D-lås, ok read(b) X-lås, ok write(a) X-lås, ok write(b) Commit T2(20) read(b) D-lås, ok write(b) X-lås, konflikt, släpp lås, omstart Nu kan transaktion 2 köra klart.
Lösningsförslag till tentamen i Databasteknik c. T1 läser A: TS T1 =10 och TS R (A) = 0 ok T1 läser B: TS T1 =10 och TS R (B) = 0 ok T2 läser B: TS T2 =20 och TS R (B) = 10 ok T1 skriver A: TS T1 =10 och TS R (A) = 10 ok, TS W (A) = 0 ok T2 skiver B: TS T2 =20 och TS R (B) = 20 ok, TS W (B) = 0 ok T1 skiver B: TS T1 =10 och TS R (B) = 20 konflikt, rollback och omstart med tiden = 30 TS R (A) TS W (A) TS R (B) TS W (B) 0 0 0 0 10 10 20 10 20 Nu är T2 klar så T1 kan köra klart. 6. Det initiala evalueringsträdet ser ut så: π företag σ våning = 2 σ typ = tomat Vara.varunr = Lager.varunr Lager.avd = Avdelning.avd Lager Vara Avdelning Splittra selektioner och för ner dem så långt som möjligt i trädet. Projicera ut det som behövs för vidare operationer. Vi får följande: π företag σ Vara.varunr = Lager.varunr σ Lager.avd = Avdelning.avd Lager π varunr π avd σ typ = tomat σ våning = 2 Vara Avdelning Ordna om lövnoderna så att naturlig join kan användas
Lösningsförslag till tentamen i Databasteknik π företag π varunr Lager π avd σ typ = tomat σ våning = 2 Vara Avdelning Nu ordnar vi om lövnoderna så att minsta datamängden ligger till vänster. Vi får då ordningen (vänster till höger): Vara, Avdelning, Lager Eftersom datamängden från Vara blir liten kan den ligga kvar i PM och en blocknästlad join blir snabb. Samma för Avdelning.