Tentamen i Onsdagen den 7 mars 2007 Tillåtna hjälpmedel: Allt skrivet material 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 75% av den totala examinationen + bonus max 25% Betygsgränser : KTH SU 3 50% G 50% 4 63% VG 69% 5 75% Lycka till! Kjell 1. (20%) Ett företag som säljer nya bilar har ett register över sålda bilar, bilarnas extrautrustning, extrautrustningens pris (per del i extrautrustningen) och eventuell rabatt på olika delar i extrautrustningen som dessutom kan vara olika för olika bilar.
Tentamen i Kjell Lindqvist, (08) 790 62 76 Registret ser ut på följande sätt: Bilnr FörsDatum ExtraUtr Pris för ExtraUtr RabattPåExtraUtr ABC123 070115 FartHållare 3500 25% ABC123 070115 Radio 2000 15% ABC123 070115 AC 4000 30% BAC321 070115 Radio 2000 20% a (4%) b (3%) c (13%) 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% 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 string(30). a (4%) Översätt följande uttryck i relationsalgebra till SQL: tmp(a, n) avd G count(*) ((σ våning = 2 våning = 3 (Avdelning)) (σ företag = adidas (Lager))) π A (tmp G max (n) as n (tmp)) b (5%) Översätt följande SQL-fråga till ett tupelkalkyluttryck: select An.chef from Anställd An, Avdelning Av where An.avd = Av.avd and Av.våning = 1 and exists (select * from Anställd Bn, Avdelning Bv where Bn.avd = Bv.avd and An.chef = Bn.chef and Av.våning <> Bv.våning); c (6%) Skriv SQL-frågor mot varuhusdatabasen som besvarar följande frågor: i På vilka våningar är man ensamma om att sälja en typ av vara? ii På vilken våning finns det flest anställda? Sid 2
Tentamen i Kjell Lindqvist, (08) 790 62 76 3. 15% a (3%) Givet följande B + -träd där alla noder utom roten kan innehålla 1-2 nycklar. Visa vad som händer då nyckeln 44 tas bort. b (3%) För vilken blockstorlek är trädet (i a) designat? c (5%) Antag att vi vill konstruera index för relationerna R(A, B), S(B, C) där A, B och C är av typen integer och vi vill evaluera σ A <= 56 C =65 (R S) så snabbt som möjligt. Hur skall index(en) definieras och vilken är indexens respektive typ? d (4%) Under vilka omständigheter lönar det sig att inte indexera ett attribut? 4. 15% a (7%) Avgör om följande operationsföljder är serialiserbara. 1. r2(a); w1(a); w2(a); r1(a) 2. w1(a); w2(b); r1(a); r3(b); w3(a); r1(b) (r2 betyder att transaktion 2 läser) b (8%) Under kursen har vi diskuterat strategier för återhämtning efter krasch. I detta problem antar vi att, före det att en transaktion påbörjar sina operationer så vet man vilka block som kommer att användas. Vi kan vidare anta att transaktionerna körs en och en så vi inte behöver ta hänsyn till parallellitetsproblem. Det är även så att en transaktion involverar endast ett fåtal block så vi får plats med alla block, som kommer att användas, i primärminnet. Anta att vi designat följande enkla sätt att utföra transaktionerna utan loggning: Före det att transaktionen påbörjar sina operationer laddas de block som kommer att beröras in till primärminnet. Transaktionen utför därefter alla ändringar i primärminnet och slutligen skrivs blocken på respektive plats på sekundärminnet. Vilka problem kan vi få med ovanstående strategi? Vilka av egenskaperna (ACID) hos en transaktion är inte säkert uppfyllda om vi råkar ut för en systemkrasch? Sid 3
Tentamen i Kjell Lindqvist, (08) 790 62 76 5. 10% Visa hur frågan π A (tmp G max (n) as n (tmp)) där tmp definieras på följande sätt: tmp(a, n) avd G count(*) ((σ våning = 2 våning = 3 (Avdelning)) (σ företag = adidas (Lager))) optimeras och exekveras. För Lager gäller att varunr är av typen integer och avd och företag är av typen varchar(30), i Avdelning är våning av typen integer och avd av typen varchar(30). Avdelning har 30 tupler och lager 8000 tupler. Blockstorleken är 2Kbyte och de enda index som finns är B + -träd på primärnycklarna. Sid 4
Lösningsförslag till Tentamen i Onsdagen den 7 mars 2007 Tillåtna hjälpmedel: Allt skrivet material 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 75% av den totala examinationen + bonus max 25% Betygsgränser : KTH SU 3 50% G 50% 4 63% VG 69% 5 75%
Kjell Lindqvist, (08) 790 62 76 Lösningsförslag till Tentamen i 1. (20%) a Bilnr FörsDatum ExtraUtr PrisFörExtraUtr Bilnr, ExtraUtr RabattPåExtraUtr b Eftersom man bara lägger in ny information så får vi inte några uppdaterings- och borttagningsproblem. Insättningsproblem: Vi kan inte registrera ny extrautrustning och priset på denna. c Bilnr, ExtraUtr är den enda kandidatnyckeln så vi får 1NF: ((Bilnr, ExtraUtr) FörsDatum, PrisFörExtraUtr, RabattPåExtraUtr) Bryt ut icke-primattribut som inte är FFD av varje kandidatnyckel Icke-primattribut: FörsDatum, PrisFörExtraUtr, RabattPåExtraUtr Eftersom PrisFörExtraUtr bara beror av ExtraUtr så bryter vi ut PrisFörExtraUtr. ((ExtraUtr) PrisFörExtraUtr) FörsDatum beror bara av Bilnr ((Bilnr) FörsDatum) Och kvar blir ((Bilnr, ExtraUtr) RabattPåExtraUtr) Vi gör reverse engineering: ExtraUtr Detta verkar rimligt så den slutliga strukturen blir: ((Bilnr, ExtraUtr) RabattPåExtraUtr) ((ExtraUtr) PrisFörExtraUtr) ((Bilnr) FörsDatum) Bil d Om vi ofta vill titta på rabatter för extrautrustning för bilar som salts viss dag och vi har ett stort register så kan det löna sig att ha registret som i b. Sid 2
Kjell Lindqvist, (08) 790 62 76 Lösningsförslag till Tentamen i 2. a create view tmp(a, n) as select avd, count(*) from Avdelning, Lager where våning = 2 or våning = 3 and företag = adidas and Avdelning.avd = Lager.avd; select A from tmp where n = (select max(n) from tmp); b {t.chef t Anställd ( s)(s Avdelning t.avd = s.avd s.våning = 1 ( u)( v)(u Anställd v Avdelning u.avd = v.avd t.chef = u.chef s.våning v.våning)} c i create view tmp as select typ, våningn from Avdelning A, Försäljning F, Vara V where A.avd = F.avd and F.varunr = V.varunr; select T.typ from tmp T where not exists (select * from tmp where våning <> T.våning and typ = T.typ): ii create view tmp as select våning, count(*) as n from Anställd A, Avdelning B where A.avd = B.avd group by B.våning; select våning from tmp where n = (select max(n) from tmp); 3. a 37 b Max 2 nycklar och 3 pekare i varje nod. Ett heltal representeras med 4 byte och en pekare med 4 byte. Blockstorleken blir då 20 byte. c Hash eller B + -träd på C eftersom vi har en punktfråga och B + -träd på A då vi här har en intervallfråga. B kan indexeras med hash eller B + -träd eller inget index eftersom algoritmen för naturlig-join själv tillverkar ett index. d Då vi räknar med att en stor del av datamängden (>80%) selekteras eller om många operationer modifierar relationen. Sid 3
Kjell Lindqvist, (08) 790 62 76 Lösningsförslag till Tentamen i 4. a r2(a); w1(a); w2(a); r1(a) w1(a); w2(a) T1 T2 r2(a); w1(a) Ej serialiserbar. w1(a); w2(b); r1(a); r3(b); w3(a); r1(b) T1 T2 w1(a); r3(a) w2(b); r3(b) T3 Vi får ingen cykel så operationsföljden är serialiserbar. b Om en transaktion har genomfört alla sina operationer och påbörjat sin skrivfas då ett fel inträffar så kommer vissa block att ha skrivits och andra inte. Detta innebär att databasen lämnas i ett inkonsistent tillstånd. Om disken kraschar så kommer inte de transaktioner som utförts efter senaste backup att vara bevarade. De egenskaper (ACID) som inte säkert är uppfyllda är: A om endast en del av de buffrar som databasen har modifierat skrivs till SM före ett fel så betyder det att en del av transaktionens operationer genomförs men inte andra. C databasen kan hamna i ett inkonsistent tillstånd om inte alla buffrar har skrivits då ett fel inträffar. D om disken kraschar så går redan permanentade transaktioner förlorade. (I är inte så relevant här eftersom transaktionerna körs en och en) Sid 4
Kjell Lindqvist, (08) 790 62 76 Lösningsförslag till Tentamen i 5. Det initiala evalueringsträdet: π A avd as AG count(*) as n G max(n) as n avd as AG count(*) as n σ våning =2 våning = 3 σ företag= adidas Avdelning Lager σ våning =2 våning = 3 σ företag= adidas Avdelning Lager Omforma villkoret med eller enligt A B ( A B) det blir då (våning 2 våning 3) För ner selektioner så långt som möjligt. Klart! Projicera ut endast det som behövs. Från lager projiceras endast företag, avd och varunr. För max(n) använder vi pipelining från partitionering. För partitionering och aggregering använder vi hashing. Joinoperationerna görs med blocknästlad join. De två delträden under den sista joinoperationen bör byta plats eftersom det högra delträdet ger den minsta datamängden. De nedersta delträden kommer i rätt ordning. Sid 5
Kjell Lindqvist, (08) 790 62 76 Lösningsförslag till Tentamen i Evalueringsträdet blir då: π A G max(n) as n avd as AG count(*) as n avd as AG count(*) as n π avd π avd, varunr π avd π avd, varunr σ (våning 2 våning 3) σ företag= adidas σ (våning 2 våning 3) Avdelning σ företag= adidas π företag, avd, varunr Lager Avdelning π företag, avd, varunr Lager Sid 6