Repetisjonsforelesning, SQL og utover Evgenij Thorstensen V18 Evgenij Thorstensen Repetisjon V18 1 / 23
Temaer SQL, semantikk Databasearkitektur Spørringskompilering og optimisering Indekser Transaksjonshåndtering Logging Samtidighetskontroll Evgenij Thorstensen Repetisjon V18 2 / 23
SQL, recap semantikk Først beregnes SELECT-FROM-WHERE Så leses GROUP BY, og tabellen deles opp i en gruppe per verdi av det som er i GROUP BY Så beregnes aggregater for hver gruppe ny tabell, en rad per gruppe Så filtreres denne på HAVING-betingelser. Andre ting: Korrelerte subspørringer, rekursiv SQL. Evgenij Thorstensen Repetisjon V18 3 / 23
Korrelerte subspørringer Ikke spesielt effektivt, men nyttig og funker ofte bra. SELECT employee_number, name FROM employees AS emp WHERE salary > ( SELECT AVG(salary) FROM employees WHERE department = emp.department); For-løkke over radene i emp. Ingen GROUP BY i indre spørring nødvendig. Evgenij Thorstensen Repetisjon V18 4 / 23
Rekursiv SQL Rekursiv spørring kjører igjen og igjen på sitt eget resultat + vanlige tabeller. WITH RECURSIVE subordinates AS ( SELECT employee_id, manager_id, full_name FROM employees WHERE employee_id = 2 UNION SELECT e.employee_id, e.manager_id, e.full_name FROM employees e INNER JOIN subordinates s ON s.employee_id = e. manager_id ) SELECT * FROM subordinates; Evgenij Thorstensen Repetisjon V18 5 / 23
Databasearkitektur Databasesystemer lagrer (nesten) alt som tabeller. Fysisk realiseres dette via blokker av records, som er lese/skrive-enhet. Vi har ikke gått i dybden på dette. Evgenij Thorstensen Repetisjon V18 6 / 23
Optimisering av spørringer SQL oversettes til relasjonsalgebra, som igjen oversettes til faktiske algoritmer for deloperasjonene. Optimisering i begge stegene. Basert på generelle regler samt estimering av resultatstørrelser. Det siste basert på statistikk om data i våre tabeller. Evgenij Thorstensen Repetisjon V18 7 / 23
Algebraisk optimisering Generelt: Seleksjoner dyttes inn, eller ned. Joins utføres minste først ut fra estimering. Målet er å bli kvitt tupler så raskt som mulig, samt unngå unødvendig lesing fra disk. Evgenij Thorstensen Repetisjon V18 8 / 23
Valg av algoritmer Hovedsakelig ut fra antall IO-operasjoner, da disse er mye dyrere enn CPU. Indekser anvendes der det forventes at resultatet er lite. Joins via hashing eller sortering, eventuelt ved for-loop. Flerfasealgoritmer hvis det ikke er nok minne. Evgenij Thorstensen Repetisjon V18 9 / 23
Estimering Basert på antagelser om fordelingen av verdier på tuplene. Vanligvis antar vi en jevn fordeling. σ x=c (R) = 1 V(R) T(R), like mange tupler per verdi. σ x<c (R) = 1 3T(R), litt ut av lufta. σ x c (R) = T(R) 1 V(R) T(R), motsatt av likhet. Joins estimeres via seleksjon over produkt. R x=y S = σ x=y (R S). Evgenij Thorstensen Repetisjon V18 10 / 23
Joinestimering Vi antar at alle verdier matches. R x=y S får da tupler. T(R) T(S) max(v(r), V(S)) AND og OR blir til sum og produkt av estimater for hver betingelse (grovt sagt). Evgenij Thorstensen Repetisjon V18 11 / 23
Indekser Indekser tillater oss å direkte hente relevante blokker. Søketrær (B-tree) og hashing er de vanligste. Tett versus tynn: Hvis tuplene er sortert på nøkkelen, kan peke til blokker i stedet for til tupler. Vanlig med tett, å holde data sortert er for krevende. Indekser er bra når man er ute etter relativt få tupler/blokker. Evgenij Thorstensen Repetisjon V18 12 / 23
Transaksjoner ACID: Atomicity, Consistency, Isolation, Durability. Disse ivaretas ved hjelp av logging samtidighetskontroll Mye optimistiske algoritmer: Rydd opp hvis/når det går galt. Evgenij Thorstensen Repetisjon V18 13 / 23
Logging Undo, Redo, og Undo/Redo. Alt sammen Write-Ahead Logging. Før en skriveoperasjon foretas på ekte data på disk, logges det til disk gammel verdi (undo) ny verdi (redo) begge (undo/redo) To viktige ting: recovery og checkpointing. Evgenij Thorstensen Repetisjon V18 14 / 23
Recovery Ved undo, kan ha skitne data på disk. Men, har gamle verdier i logg. Ved redo, kan ikke ha skitne data på disk. Men, kan ha rene data i logg, som kan skrives til disk. Ved undo/redo, begge deler. Gir full fleksibilitet ang. skriving til disk, men krever dobbelt med plass. Evgenij Thorstensen Repetisjon V18 15 / 23
Checkpointing Prosedyre for å kutte loggen/tvinge disk-skriving. For undo, noter aktive transaksjoner, skriv en END CKPT når de er ferdige. For redo, tving diskskriving for alt som venter. Samme ide for U/R. Evgenij Thorstensen Repetisjon V18 16 / 23
Samtidighet Isolasjonsnivåer: Vi har sett mye på serialiserbarhet. Protokoller basert på Låsing Tidsstempling SI/MVCC Andre begreper: deadlock, starvation, cascading rollback. Evgenij Thorstensen Repetisjon V18 17 / 23
Serialiserbarhet En plan er serialiserbar hvis resultatet er ekvivalent med en seriell plan. Konfliktserialiserbarhet: Serialiserbarhet uavhengig av hva som leses og skrives. Vi krever ekvivalens, så: Operasjoner fra samme transaksjon er i konflikt Skriving er i konflikt med både lesing og skriving når to transaksjoner opererer på samme element. Evgenij Thorstensen Repetisjon V18 18 / 23
Konfliktserialiserbarhet Operasjoner som er naboer og ikke er i konflikt, kan bytte plass uten å endre resultatet. Hvis dette fører til en seriell plan, er vår opprinnelige plan serialiserbar. Kan testes ved hjelp av presedensgraf. Evgenij Thorstensen Repetisjon V18 19 / 23
2PL Tofaselåsing: Kan ikke slippe en lås og så ta en ny. Sikrer serialiserbarhet. Varianter: strikt 2PL (skrivelåser slippes helt til slutt), sikrer mot cascading rollback (fordi skitten les er umulig). Kan også legge på shared locks, upgrade locks; unngår en del deadlock. Evgenij Thorstensen Repetisjon V18 20 / 23
Tidsstempling Optimistisk protokoll. Holder rede på hvem som sist leste/skrev dataelementer. Hvis T skal skrive A og en nyere T har lest A, abort T. Hvis T skal lese A og en nyerer T har skrevet A, abort T. Pluss litt book-keeping med commit-flagg og overskriving. Evgenij Thorstensen Repetisjon V18 21 / 23
Tidsstempling med validering Holder rede på hvilke elementer hver transaksjon har skrevet og lest. Transaksjoner bufrer det de skal skrive. Når de er ferdige, blir de validert før de får skrive. Validering sjekker overlapp mellom lese- og skrivemengdene mot andre allerede validerte transaksjoner. Evgenij Thorstensen Repetisjon V18 22 / 23
SI med FUW Vanligvis implementert med skrivelåser. Transaksjoner leser siste committede versjon av elementer. Skriving iht. lås, men: Hvis flere samtidige transaksjoner skal skrive samme element, vil den første som committer vinne. De andre blir abortert. Sikrer ikke serialiserbarhet, men sikrer mot det meste av anomalier. Evgenij Thorstensen Repetisjon V18 23 / 23