Kapittel 7 · Forelesning 13 · Del 2

Spørringsutføring

Aksessmetoder, sortering og join-algoritmer — hvordan en SELECT faktisk blir kjørt mot disk.

Helhetsbilde

Fra plan til resultat

I forrige kapittel så vi hvor data ligger — heap, B+-tre, hash. Nå ser vi hvordan databasen faktisk plukker dem opp og setter dem sammen.

  • Optimizer velger plan, executor kjører den
  • Aksessmetoder: full scan, index scan, index-only scan, bitmap scan
  • External merge sort — sortering når data er større enn RAM
  • Tre join-algoritmer: nested loop, sort-merge, hash join — hver med sine kostnadsprofiler
  • EXPLAIN viser den valgte planen og hjelper med feilsøking
Slides

Se også queries.pdf for figurer og eksempelplaner.

Læringsmodul

Utforsk kapittelet

Innholdssiden er bygget som en gjennomgang med interaktive figurer og innebygde sjekkspørsmål mellom hver del. Bruk «Neste steg»-knappene i animasjonene for å følge merge sort, nested loop, sort-merge og hash join trinn for trinn.

Nøkkelbegreper

Vokabular du kunne

BegrepForklaring
AksessmetodeHvordan executoren henter rader: full scan, index scan, index-only, bitmap.
SelektivitetAndel rader som tilfredsstiller et predikat. Brukes til å estimere kost.
External merge sortSortering på disk i to faser: initialfase + merge. n_R, d_M, antall passer.
Block nested loop joinYtre tabell i biter inn i bufferet; indre scannes per bit.
Sort-merge joinSorter begge sider, gå gjennom med to pekere.
Hash joinBygg hash på liten side, probe stor side.
Grace hash joinPartisjoner begge tabeller når hash-tabellen ikke får plass i RAM.
EXPLAINViser plantreet uten å kjøre. EXPLAIN ANALYZE kjører og rapporterer faktisk tid.
HistogramStatistikk-struktur som lagrer fordelingen av verdier — bedre selektivitetsestimater enn min/max.

Test deg selv

Hurtig sjekk på de viktigste konseptene. Den fyldige sluttquizen ligger på innholdssiden.

Spørsmål 1 · Lett
Hva er forskjellen på en optimizer og en executor i et DBMS?
Optimizeren velger en utføringsplan basert på statistikk og kostnadsestimater. Executoren kjører den valgte planen ved å kalle aksessmetoder mot lagring og kombinere resultater.
Spørsmål 2 · Lett
Nevn de fire grunnleggende aksessmetodene.
Full table scan, index scan, index-only scan, bitmap scan.
Spørsmål 3 · Middels
Hvorfor er clustered versus unclustered indeks så avgjørende ved range-spørringer?
Clustered = radene ligger fysisk i nøkkelorden, så et range-treff blir et sammenhengende blokk-scan. Unclustered = radene er spredt; hvert treff kan bety en ny RID-pekerfølging og en ny blokk-aksess. Ved bredt treff blir unclustered ofte verre enn full scan.
Spørsmål 4 · Middels
I external merge sort: hva er totalformelen for I/O og hvorfor multipliseres b med 2?
Total I/O = 2b · (1 + #merge-passes). 2-en kommer av at hvert pass både leser og skriver hele datasettet — initial-passet inkludert.
Spørsmål 5 · Vanskelig
b = 1024 blokker, n_B = 5 buffer. Hva er n_R, d_M og antall mergepasser?
n_R = ⌈1024/5⌉ = 205. d_M = 4. Antall passes = ⌈log₄(205)⌉ = 4. Total I/O = 2·1024·(1+4) = 10 240 blokker.
Spørsmål 6 · Lett
Hvilken tabell bør være ytre i en block nested loop join?
Den minste. Antall passer over indre tabell er ⌈|ytre|/(n_B−2)⌉, og det vil vi minimere.
Spørsmål 7 · Middels
Department har 5 blokker, Employee har 1000 blokker, buffer 5. Beregn block nested loop med Department ytre.
5 + ⌈5/3⌉·1000 = 5 + 2·1000 = 2005 blokker. Med Employee ytre: 1000 + ⌈1000/3⌉·5 = 2670. Department ytre vinner.
Spørsmål 8 · Middels
Når er sort-merge join klart bedre enn hash join?
(a) Når begge tabeller allerede er sortert på join-attributtet — sortfasen er gratis. (b) Når output uansett skal sorteres. (c) For ulikhets-join (R.x < S.y) der hash er ubrukelig.
Spørsmål 9 · Vanskelig
Hvorfor bygger hash join hash-tabellen på den minste tabellen, og ikke den største?
Hash-tabellen må holdes i minnet. Mindre build-side ⇒ får plass i mindre buffer ⇒ unngår grace-fasen. I/O-kosten er strukturelt symmetrisk (én scan av hver), men minneforbruket avgjør om vi klarer å unngå disk-partisjonering.
Spørsmål 10 · Middels
Hva er selektivitet, og hvilken statistikk bruker optimizeren for å estimere den?
Selektivitet = andel rader som passer et predikat. Optimizeren bruker n(R), V(A,R), min/max og — for skjeve fordelinger — histogrammer. Standardformler: WHERE A=c ⇒ 1/V(A,R); WHERE A>c ⇒ (max−c)/(max−min).
Spørsmål 11 · Vanskelig
EXPLAIN ANALYZE viser estimat 12 rader, faktisk 180 000. Hva er problemet og hvilket tiltak fungerer ofte?
Statistikken er utdatert eller for grov. Optimizeren har sannsynligvis valgt nested loop forventet å prosessere 12 rader, men kjører den nå på 180 000 ⇒ kvadratisk eksplosjon. Tiltak: kjør ANALYZE table, vurder histogram med flere bins, sjekk at predikatet ikke skjuler indeksbruk via funksjon eller cast.
Spørsmål 12 · Vanskelig
En unclustered B+-indeks finnes på salary. Spørringen er WHERE salary > 0. Optimizeren velger full table scan. Forklar.
Predikatet matcher alle radene. Med unclustered indeks blir kostnaden antall treff × en blokk pr. RID = opp mot 100 000 blokker for 100 000 rader. Full scan = ~1961 blokker. Optimizerens kostnadsmodell ser raskt at indeksen er verre selv om den teknisk er anvendelig.