Här är de SQL-kommandon som användes för att skapa databasen, och för att lägga in några exempelrader:
CREATE TABLE Kurser (Kod VARCHAR(6) NOT NULL PRIMARY KEY, Namn VARCHAR(10) NOT NULL); CREATE TABLE Studenter (ID INTEGER NOT NULL PRIMARY KEY, Personnummer VARCHAR(11) NOT NULL UNIQUE, Namn VARCHAR(40) NOT NULL); CREATE TABLE Betyg (ID INTEGER NOT NULL PRIMARY KEY, Student INTEGER REFERENCES Studenter(ID), Kurs VARCHAR(6) REFERENCES Kurser(Kod), Betyg CHAR(2)); INSERT INTO Kurser (Kod, Namn) VALUES ('IK123', 'Atomfysik'); INSERT INTO Kurser (Kod, Namn) VALUES ('IK456', 'SQL Server'); INSERT INTO Studenter (ID, Personnummer, Namn) VALUES (1, '900123-1234', 'Bruce Wayne'); INSERT INTO Studenter (ID, Personnummer, Namn) VALUES (2, '900221-4321', 'Clark Kent'); INSERT INTO Studenter (ID, Personnummer, Namn) VALUES (3, '901118-2341', 'Barbara Gordon'); INSERT INTO Studenter (ID, Personnummer, Namn) VALUES (4, '900216-2431', 'Katherine Kane'); INSERT INTO Betyg (ID, Student, Kurs, Betyg) VALUES (1, 1, 'IK123', 'G'); INSERT INTO Betyg (ID, Student, Kurs, Betyg) VALUES (2, 1, 'IK456', 'VG'); INSERT INTO Betyg (ID, Student, Kurs, Betyg) VALUES (3, 2, 'IK123', 'U'); INSERT INTO Betyg (ID, Student, Kurs, Betyg) VALUES (4, 3, 'IK456', 'VG'); INSERT INTO Betyg (ID, Student, Kurs, Betyg) VALUES (5, 4, 'IK123', 'G'); INSERT INTO Betyg (ID, Student, Kurs, Betyg) VALUES (6, 4, 'IK456', 'VG');
På riktigt innehåller databasen tusen kurser, tio tusen studenter, och en miljon betyg. Vi antar att vi använder en normal, diskbaserad relationsdatabashanterare som använder sig av B+-trädsindex. Den har en bra frågeoptimerare. Data lagras på mekaniska hårddiskar (dvs inte SSD:er). Databashanteraren skapar automatiskt fysiska primärindex på de angivna primärnycklarna, och vi har inte skapat ytterligare index.
Kopplar upp sig... Ok. Ange studentens personnummer: 900123-1234 Studenten med personnummer 900123-1234 har följande betyg: Kurs Betyg ==== ===== Atomfysik G SQL Server VG
Programmet ska använda sig av någon form av databasåtkomst inifrån programmet, till exempel med JDBC från ett Java-program, ODBC eller ESQL från ett C-program, ADO.NET, eller liknande.
select Betyg.Betyg from Studenter, Betyg, Kurser where Studenter.ID = Betyg.Student and Betyg.Kurs = Kurser.Kod and Studenter.Namn = 'Bruce Wayne' and Kurser.Namn = 'Atomfysik';
a) Ange den systematiska översättningen av frågan, även kallad kanonisk form, till relationsalgebra. (Det är alltså den o-optimerade formen.) Skriv den som ett relationsalgebrauttryck.
b) Rita upp samma relationsalgebrauttryck som ett träd.
c) Visa hur en heuristisk frågeoptimerare, som inte tar hänsyn till datamängder eller lagringsstrukturer, optimerar den kanoniska formen. Visa både vilka olika optimeringar som görs, och vad slutresultatet blir.
d) En kostnadsbaserad frågeoptimerare har inte enkla regler för hur hur den ska köra frågan, utan jämför alla sätt att köra frågan som finns, och väljer det snabbaste. Hur är det troligt att den skulle välja att göra i det här fallet, med index endast på primärnycklar, och de angivna datamängderna? Varför?
Vi söker efter ett betyg med ett visst ID-nummer i den riktiga databasen, den med en miljon betyg, och ställer följande SQL-fråga:
Eftersom kolumnen ID är primärnyckel i tabellen, och databashanteraren automatiskt skapar fysiska primärindex, finns ett primärindex på ID. Hur lång tid tar den frågan att köra? Gör rimliga antaganden om blockstorlek med mera, ange de antaganden du gjort, och visa hur du räknat.SELECT * FROM Betyg WHERE ID = 456789;
b)
Nu söker vi efter ett betyg i en viss kurs, och skriver följande SQL-fråga.
Det finns inget index på kolumnen Kurs. Hur lång tid tar frågan att köra? Ange de antaganden du gjort, och visa hur du räknat. (För enkelhets skull kan vi anta att det råkar finns bara ett enda betyg från kursen med den sökta kurskoden.)SELECT * FROM Betyg WHERE Kurs = 'DT109G';
c)
Vi skapar ett sekundärindex på Kurs:
Hur lång tid tar frågan nu att köra? Ange de antaganden du gjort, och visa hur du räknat.SELECT * FROM Betyg WHERE Kurs = 'DT109G';
Tid | T1 | T2 | T3 |
---|---|---|---|
1 | Start | ||
2 | Start | ||
3 | Start | ||
4 | Läs(A) | ||
5 | Skriv(B) | ||
6 | Läs(A) | ||
7 | Skriv(B) | ||
8 | Läs(A) | ||
9 | Läs(B) | ||
10 | Skriv(A) | ||
11 | Skriv(B) | ||
12 | Skriv(C) | ||
13 | Skriv(C) | ||
14 | Skriv(C) | ||
15 | Commit | ||
16 | Commit | ||
17 | Commit |
a) (1p) Vad innebär det att ett tidsschema är serialiserbart?
b) (1p) Är schemat ovan seriellt? Motivera svaret!
c) (1p) Är schemat ovan serialiserbart? Motivera svaret!
d) (2p) Välj en av följande metoder för isolering av transaktioner, och visa hur tidsschemat ovan skulle förändras om respektive metod användes. (Observera: Välj alltså en av dessa metoder!)
Det kan vara lämpligt med en eller kanske två A4-sidor text per ämne för själva beskrivningen. Men ha gärna med förklarande exempel, och i så fall kan det gå åt ytterligare en eller flera sidor för exemplen.
Använd gärna källor, men: