Distribuerte databasesystemer.
Anta T2 inneholder 10 ganger så mange rader som T1 (kun et eksempel). Spørreresultatet vil ha like mange rader som det er rader i T1. Fordi en rad i spørreresultatet kun inneholder primærnøkkelen i T1 og et heltall, antar vi at samlet plassbehov for spørreresultatet er 20% av plassbehovet til T1.
Anta at spørringen blir initiert i Trondheim (brukeren sitter her). Noen strategier:
Hvis vi kun sammenligner mengden av data som bli overført er strategi 4 klart best, deretter strategi 3 og til slutt strategi 1 og 2 som like dårlige. For strategi 4 får vi riktignok en ekstrajobb med å sette sammen de tre "delresultatene" til slutt. Tilsvarende resonnementer kan gjøres for å analysere hva som skjer når spørringen blir initiert fra Bergen eller Oslo. Hvis spørringen blir initiert fra Oslo er det tilstrekkelig å overføre omlag 40% av spørreresultatet.
Hvis T2 kun er lagret på én node (og vi antar at T2 krever mye større plass enn T1) vil det trolig lønne seg å overføre (alle fragmenter av) T1 til denne noden, utføre spørringen her, og deretter overføre resultatet til initierende node.
Algoritmer for behandling av data på disk.
Vi må først sortere tabellene med hensyn på koblingskolonnen. I begge tilfeller kan dette gjøres med 1 fletting (filene inneholder færre enn 1002 blokker). For tabell S trenger vi 3 × 1 000 = 3 000 diskaksesser, og for T trenger vi 3 × 3 000 = 9 000 diskaksesser. Selve flettekoblingen krever 1 000 + 3 000 = 4 000 diskaksesser. Altså totalt 16 000 diskaksesser.
Spørreoptimalisering.
Hvilke varer har kunde 17 kjøpt siste måned?
Bruker MySQL-funksjoner Year, Month og Date.
SELECT DISTINCT Vare.VNr, Betegnelse
FROM Ordre, Ordrelinje, Vare
WHERE Ordre.OrdreNr=Ordrelinje.OrdreNr
AND Ordrelinje.VNr = Vare.VNr
AND Ordre.KNr = 17
AND Year(Ordre.Dato) = Year(CurDate())
AND Month(Ordre.Dato) = Month(CurDate())
Relasjonsalgebra.
Vi forkorter navn på tabellene til O, OL og V for å spare litt plass.
ΠV.VNr,Betegnelse( σO.KNr=17 ∧ Year(O.Dato)=Year(CurDate()) ∧ Month(O.Dato)=Month(CurDate())( O ⊗O.OrdreNr=OL.OrdreNr( OL ⊗OL.VNr=V.VNr V ) )
Bruk av omskrivningsregler.
Én ekvivalent spørring blir som følger:
ΠV.VNr,Betegnelse( V ⊗OL.VNr=V.VNr( OL ⊗O.OrdreNr=OL.OrdreNr σO.KNr=17 ∧ Year(O.Dato)=Year(CurDate()) ∧ Month(O.Dato)=Month(CurDate())(O ) )
Merk at det i dette eksemplet ikke var nødvendig å splitte opp den sammensatte betingelsen i seleksjonen, fordi alle delbetingelsene hadde å gjøre med Ordre.
Beregning av kostnader.
Løsningsforslag foreligger ikke.
Brukeradministrasjon.
Løsningen bruker Oracle-syntaks.
-- a) Oppretter roller
CREATE ROLE innsyn;
CREATE ROLE oppdatering;
CREATE ROLE utvikler;
-- Tildeler rettigheter til rollene
GRANT SELECT ON Ordre TO innsyn;
GRANT SELECT ON Vare TO innsyn;
-- og så videre...
GRANT INSERT, UPDATE, DELETE ON Ordre TO oppdatering;
-- og så videre...
GRANT CREATE ANY TABLE TO utvikler;
GRANT DROP ANY TABLE TO utvikler;
GRANT innsyn TO utvikler;
-- b) Oppretter brukere
CREATE USER ola;
CREATE USER lise;
CREATE USER kari;
-- Tildeler roller til brukere
GRANT ROLE innsyn TO ola;
GRANT ROLE ajourhold TO lise;
GRANT ROLE utvikler TO kari;
-- c) Tildele en bestemt bruker leserettighet
GRANT SELECT ON Vare TO kari;
-- d) Trekker tilbake leserettigheten
REVOKE SELECT ON Vare FROM kari;
Lesetilgang til utvalgte rader.
Lag et view som "inneholder" de aktuelle radene:
CREATE VIEW NoenRader AS
SELECT *
FROM Tabell
WHERE Betingelse;
Lag deretter en rolle og tildel denne leserettighet på viewet:
CREATE ROLE R;
GRANT SELECT ON NoenRader TO R;
Til slutt kan de aktuelle brukerne få denne rollen:
GRANT R TO bruker1;
GRANT R TO bruker2;
Overvåking.
Vi bruker Oracle-syntaks i denne oppgaven.
Loggføre oppdateringer.
AUDIT UPDATE ON Kunde BY Ola;
Vis resultatet.
SELECT * FROM dba_audit_trail;
Overvåke uten AUDIT.
For å overvåke i et DBHS uten støtte for AUDIT kan man lage sin egen overvåkingsmekanisme ved hjelp av såkalte triggere, som er "programmer" som blir utført når bestemte hendelser inntreffer, for eksempel at en bestemt tabell blir oppdatert.