Databasteknik II: Inlämningsuppgift 7 - Frågeoptimering i Amos II

Det här lite av ett experiment. Vi får se hur det går. Kör ni fast totalt, får vi kanske göra om det här till en frivillig uppgift. Men försök i alla fall.

Mål

Lisp

Lisp är enkelt.
  • Alla funktionsanrop skrivs som listor, som man skriver med hjälp av parenteser. I stället för
    sin(x)
    för att räkna ut sinus av x, skriver man
    (sin x).
    I stället för
    pow(x, 3)
    skriver man
    (pow x 3).
    Notera att det inte behövs några kommatecken.
  • Alla operationer är funktionsanrop. I stället för
    2 + 3
    med infix plus-operator, tänker man sig att man anropar funktionen +, så här:
    +(2, 3).
    Men det är ju Lisp, så det anropet skrivs som en lista:
    (+ 2 3).
    Tips: Man kan skriva
    (+ 2 3 4 5 6).
  • Lisp har ingen operatorprioritet. I stället för
    2 * 3 + 4 * 5,
    som ju ska räknas ut som
    (2 * 3) + (4 * 5),
    skriver man
    (+ (* 2 3) (* 4 5)).
  • Även kontrollstrukturer som if skrivs som funktionsanrop i form av listor: I stället för
    if (a < b) f(a); else g(a, b, c);
    skriver man
    (if (< a b) (f a) (g a b c))).
  • Variabeltilldelningar skrivs inte med = utan med funktionen setq. I stället för
    a = 3;
    skriver man
    (setq a 3).
    I stället för
    x = y + z + 3 * t
    skriver man
    (setq x (+ y z (* 3 t)).
  • Lokala variabler skapar man med let, som är ungefär som ett block i C.
    (let (a b c (d 14) (e 15) f) (setq a 17) (print a))
    motsvarar
    { int a, b, c, d = 14, e = 15, f; a = 17; printf("%d\n", a); }
    (förutom att variablerna inte har några bestämda typer i Lisp).

Men om man aldrig programmerat i Lisp, kanske man tycker att uppgiften är svår. Därför är det här lite av ett experiment. Vi får se hur det går. Kör ni fast totalt, får vi kanske göra om det här till en frivillig uppgift. Men försök i alla fall.

Uppgift

Skriv en uttömmande ("exhaustive") kostnadsbaserad optimerare för Amos II. Följ den här labbinstruktionen (PDF), från databaskursen i Linköping. Ignorera föråldrade saker, som till exempel var kodskelettet "kodskelett.lsp" finns.

Kodskelett för Lisp-funktionen dynprogsort: kodskelett.lsp

För att Lisp-debugging ska fungera, ersätt den gamla amos2.dmp med den här: amos.dmp
Kräver att man anger användarnamnet db2, och lösenordet är namnet på lokalen för alla föreläsningarna i kursen (börjar på T och sen tre siffror).

Lästips

Redovisning

Visa optimeringsfunktionen. Diskutera gärna med läraren.

Arbeta i grupper om en eller två studenter. I undantagsfall kan man arbeta i grupper om tre, men fråga läraren först.

Det är tillåtet att samarbeta i större grupper än så, men varje grupp om 1-3 studenter måste fortfarande redovisa separat, och det måste också tydligt framgå (i rapporten eller på annat sätt) vilka som deltog i samarbetet.


Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se), 25 februari 2008