Gegevensbanken 2010
Query-verwerking en optimalisatie Bettina Berendt www.cs.kuleuven.be/~berendt
Query-verwerking en optimalisatie:
Motivatie & Samenvatting 2
Waar zijn we? Les Nr. 1 2 3 4 5 6 7 8
wie ED ED ED ED KV KV KV KV
9 KV 10 KV 11 BB 12 BB 13 14 15 16 17 18
BB BB BB BB BB ED
wat intro, ER EER relational model mapping EER2relational relational algebra, relational calculus SQL vervolg SQL demo Access, QBE, JDBC functional dependencies and normalisation functional dependencies and normalisation file structures and hashing indexing I indexing II and higher-dimensional structures query processing transactions query security Data warehousing and mining XML, oodb, multimedia db
Fysisch model / vragen
3
A. Wat is slimmer? SELECT empname, projectname FROM emp, project WHERE emp.SSN = project.leaderSSN AND emp.income > 1000000
π emp.empname, project.projectname σ emp.income > 1000000 σ emp.SSN = project.leader.SSN
join emp.SSN = project.leaderSSN
σ emp.income > 1000000
X emp
π emp.empname, project.projectname
project
emp
project
4
B. Wat helpt daarbij? π emp.empname, project.projectname join emp.SSN = project.leaderSSN
σ emp.income > 1000000 emp
project
5
C. Waar moeten we op letten? π emp.empname, project.projectname
blokkentransport !
join emp.SSN = project.leaderSSN
σ emp.income > 1000000 emp
project
6
Agenda Overzicht Implementatie van operaties uit relationele algebra
Heuristische optimalisatie Systematische optimalisatie d.m.v. kostenschattingen
Semantische query-optimalisatie
7
Agenda Overzicht Implementatie van operaties uit relationele algebra
Heuristische optimalisatie Systematische optimalisatie d.m.v. kostenschattingen
Semantische query-optimalisatie
8
Overzicht van queryverwerking Stappen in verwerking v. query: • lezen en ontleden van query – scanner: zet string om in tokens – parser: controleert syntactische correctheid en bouwt interne structuur op die query voorstelt
•
query optimalisatie – vaak meerdere uitvoeringsstrategieën mogelijk – meest efficiënte uitkiezen
•
codegeneratie – resultaat is uitvoerbare code
•
uitvoeren van de query 9
Query-optimalisatie – Beste strategie vinden is moeilijk en duur → in de praktijk: bepalen van een redelijk efficiënte strategie
• Netwerk model, hiërarchisch model, objectmodel: – uitvoeringsstrategie grotendeels vastgelegd in het programma (navigatie ) → weinig optimalisatiemogelijkheden
• Relationeel model, objectrelationeel model: – hoog-niveau vraagtaal (SQL, OQL) – uitvoeringsstrategie niet vastgelegd in de query – nood aan optimalistaie door DBMS 10
• optimalisatie = "kost" zo laag mogelijk houden – belangrijkste kost is meestal uitvoeringstijd – technieken voor optimalisatie: • heuristische regels voor ordenen van de bewerkingen in een query uitvoeringsstrategie – regels die in het algemeen goed werken • systematische schatting van kosten van verschillende uitvoeringsstrategieën, en kiezen van strategie met laagste kost – berekening van bv. tijd nodig voor join op basis van aantal tupels, indexen, ...
11
Agenda Overzicht Implementatie van operaties uit relationele algebra
Heuristische optimalisatie Systematische optimalisatie d.m.v. kostenschattingen
Semantische query-optimalisatie
12
Omzetting SQL → relationele algebra • SQL is gemakkelijk om te vormen naar relationele algebra – verschil: in SQL ligt volgorde van bewerkingen minder vast – relationele algebra uitdrukkingen zijn dus meer geschikt om uitvoeringsstrategie te bepalen
13
Voorbeeld van conversie SELECT SELECT Lname, Lname, Fname Fname FROM EMPLOYEE FROM EMPLOYEE WHERE WHERE Salary Salary >(SELECT >(SELECT MAX(Salary) MAX(Salary) FROM EMPLOYEE FROM EMPLOYEE WHERE WHERE Dno Dno == 55 ); );
cc := Salary(σ Dno = 5(EMPLOYEE)) := FFMAX (σ MAX Salary Dno = 5(EMPLOYEE)) ππLname, Fname (σ Salary > c(EMPLOYEE)) (σ Lname, Fname Salary > c(EMPLOYEE))
14
Implementatie van operaties uit de relationele algebra • Belangrijke hulp-procedure: sorteren – veel gebruikt voor efficiënte implementaties van andere operaties
• • • •
Selectie Join Projectie ...
15
Sorteren • Belangrijke component bij query-optimalisatie is sorteren – niet alleen om gesorteerd resultaat te bekomen (order by...) – maar ook als hulpoperatie voor andere bewerkingen
• Sorteren van informatie in externe files: "merge-sort" – strategie: korte gesorteerde lijsten samenvoegen tot een lange gesorteerde lijst – "lijsten" zijn bestanden op schijf
16
• Fase 1: – lees een deel van het bestand in buffer – sorteer records in buffer (m.b.v. intern sorteeralgoritme, bv. Quicksort) – schrijf gesorteerde buffer naar schijf als tijdelijk bestand – herhaal tot hele bestand overlopen is
• Fase 2: – meng n tijdelijke bestanden tot een gesorteerd tijdelijk bestand – herhaal tot er maar één gesorteerd bestand meer is
17
aecioxyunpehbqtzidfnskxipwjqnerhcpk splits aeciox
yunpeh
bqtzid
fnskxi
pwjqne
rhcpk
ehnpuy
bdiqtz
fiknsx
ejnpqw
chkpr
sorteer aceiox meng abcdeehiinopqtuxyz
cefhijkknnppqrswx
meng a b c c d e e e f h i i i j ...
buffer
(tijdelijk) bestand
18
19
Complexiteit - sorteerfase • •
zoveel mogelijk blokken worden samen in het geheugen gelezen en gesorteerd, d.i. afhankelijk van de beschikbare buffer ruimte met: – b – nB
•
blokken beschikbare buffers
dan: – nR = ⎡ b / nB ⎤ “runs” nodig – elke “run” geeft een gesorteerd deelbestand
• •
elk blok wordt een keer ingelezen en een keer geschreven: voor b blokken: 2*b voorbeeld: – nB = 5 b = 1024 – dan: nR = ⎡ 1024 / 5 ⎤ = 205 ⇒ 205 gesorteerde deelbestanden 20
Complexiteit: Mengfase, totaal in1
in2
in3
uit
buffer
• mengfase: • mengingsgraad dM: – aantal deelbestanden die ineens gemengd kunnen worden = aantal beschikbare buffers – 1 = nB – 1 – aantal doorgangen (“passes”): ⎡ logdM (nR) ⎤ – voorbeeld: • dM = 4 • aantal gesorteerde deelbestanden: 205 → 52 → 13 → 4 → 1 – complexiteit: 2 * b * ( logdM nR )
• totale complexiteit 2 * b + 2 * b * ( logdM nR )
21
Selectie • Verschillende strategieën mogelijk, naargelang van – soort selectiecriterium – bestaan van indexen
• Voorbeelden criteria: – – – – –
OP1: σ Ssn = ‘123456789’ (EMPLOYEE) OP2: σ Dnumber > 5 (DEPARTMENT) OP3: σ Dno = 5 (EMPLOYEE) OP4: σ Dno = 5 AND Salary > 3000 AND Sex = ‘F’ (EMPLOYEE) OP5: σ Essn = ‘123456789’ AND Pno = 10 (WORKS_ON)
22
Strategieën: • S1: lineair zoeken – doorloop hele bestand, test voor elk record of het voldoet
• S2: binair zoeken – mogelijk voor "="-conditie op sleutelattribuut dat ordening bepaalt • vb: OP1: σ Ssn = ‘123456789’ (EMPLOYEE) – als SSN een ordeningsattribuut is
• S3: gebruik van primaire index of hash functie om één record op te halen – mogelijk voor = op geïndexeerd / gehasht attribuut • vb: OP1: σ Ssn = ‘123456789’ (EMPLOYEE)
23
• S4: gebruik van primaire index om meerdere records op te halen – werkt ook voor ongelijkheden (<, ...) (zg. "range queries") • vb: OP2: σ Dnumber > 5 (DEPARTMENT)
• S5: gebruik van een cluster-index om meerdere records op te halen – =, <, ... op niet-sleutel-attribuut dat ordening bepaalt • vb: OP3: σ Dno = 5 (EMPLOYEE)
• S6: gebruik van secundaire index (B+ boom) – mogelijk voor zowel = als <, ... – resultaat: een (bij = zoeken op sleutel) of meerdere records
24
• S7: conjunctieve selectie (c1 AND c2 AND ...) – als voor een van de subcondities een van de methodes S2 - S6 bruikbaar is: • selecteer eerst volgens die subconditie • test voor elk gevonden record de andere subconditie(s) • vb: OP4: σ Dno = 5 AND Salary > 3000 AND Sex = ‘F’ (EMPLOYEE)
• S8: conjunctieve selectie met samengestelde index – mogelijk indien • "="-subcondities op meerdere attributen en • er bestaat een samengestelde index op die attributen • vb: OP5: σ Essn = ‘123456789’ AND Pno = 10 (WORKS_ON) – als gecombineerde index (Essn, Pno) op WORKS_ON bestaat 25
• S9: conjunctieve selectie door intersectie van recordpointers – mogelijk met secundaire indexen die recordwijzers (geen blokwijzers) bevatten • voor elke "="-conditie op secundair geïndexeerd attribuut: – haal verzameling recordpointers uit index op • bereken doorsnede van al die verzamelingen • haal uiteindelijk records op en filter volgens overblijvende condities
– voordeel: • voor groot deel van selectiewerk moeten enkel indexen geraadpleegd worden
26
optimalisatie van selectie • selectie met enkelvoudige voorwaarde: – indien index beschikbaar of bestand geordend: S2 – S6 – anders lineair zoeken
• selectie met conjunctieve voorwaarde (eist S7 – S9): – indien meerdere toegangspaden beschikbaar: • meest selectieve selectie eerst uitvoeren – rc = aantal records dat aan voorwaarde voldoet – r = totaal aantal records – selectiviteit = rc / r • zo laag mogelijk • schattingen van selectiviteit uit catalogus te halen
27
• selectie met disjunctieve voorwaarde • vb: OP4’: σ Dno = 5 OR Salary > 3000 OR Sex = ‘F’ (EMPLOYEE)
– moeilijk te optimaliseren: • elke deelvoorwaarde volledig te testen
– indien voor elke deelvoorwaarde efficiënte toegangspaden bestaan : • gebruik die
– zodra voor een deelvoorwaarde geen toegangspad bestaat: • lineair zoeken nodig • gebruik van indexen voor andere criteria niet meer zinvol • → in één pas doorheen gegevensbank gaan en alles testen
28
Join • Dure operatie: – vraagt veel uitvoeringstijd !
• Vaak equijoin / natuurlijke join – wij bekijken hier enkel deze
• 2-weg-join (join van 2 bestanden) vs. multi-weg-join (meerdere bestanden) – wij bekijken enkel 2-weg-join: R ZY A = B S
• Voorbeelden: – OP6: EMPLOYEE ZY Dno = Dnumber DEPARTMENT – OP7: DEPARTMENT ZY Mgr_ssn = Ssn EMPLOYEE
29
Implementatiemethodes voor Join • We beschouwen joins volgens R.A = S.B • J1: geneste lussen – voor elk record t uit R: • haal elk record s uit S op • en controleer of t [A] = s [B]
• J2: toegangsstructuur gebruiken om overeenkomstige records op te halen – als S geïndexeerd of gehasht op B : • records t van R één voor één ophalen • gebruik t [A] als zoekwaarde overeenkomstige records s van S te vinden, met s [B] = t [A] • (efficiënt)
30
• J3: sort-merge join – – – –
indien R-bestand geordend is volgens A, S volgens B join mogelijk door 1x lineair doorlopen van A en B zeer efficiënt ook mogelijk met secundaire indexen • A en B kunnen in volgorde doorlopen worden dankzij index • maar records zelf verspreid in bestand → om ze op te halen voortdurend andere blokken inlezen → kan inefficiënt worden
31
32
• J4: hash-join – idee: • R.A en S.B worden beide gehasht volgend zelfde hash-functie
– methode : • maak nieuw hash bestand aan • zet alle records van kleinste relatie (bv. R) in cellen volgens hashfunctie • voor elk record s van S: – kijk in welke cel s hoort (volgens hashing op s[B]) – zoek in die cel overeenkomstige records in R
– lineaire complexiteit → efficiënt
33
optimalisatie van joins • J1: geneste lussen waartussen kunnen we kiezen? – welk bestand wordt doorlopen in buitenste lus? • grootste of kleinste?
– hoe verdelen we de invoerbuffers? • een buffer voor elke bestand? • meer buffers voor bestand in buitenste cyclus? • meer buffers voor bestand in binnenste cyclus?
34
EMPLOYEE
DEPARTMENT bD = 10
bE = 2000
EMPLOYEE in buitenste lus: Elk blok wordt 1 x gelezen: 2 000
RESULTAAT
DEPARTMENT in binnenste lus: elk blok wordt telkens opnieuw gelezen bij volgende uitvoering van buitenste lus: 400 x 10 = 4 000 Totaal gelezen blokken:
6 000
35
DEPARTMENT
EMPLOYEE
bD = 10
bE = 2000
DEPARTMENT in buitenste lus: elk blok wordt 1 x gelezen: 10
RESULTAAT
EMPLOYEE in binnenste lus: elk blok wordt telkens opnieuw gelezen bij volgende uitvoering van buitenste lus: 2 x 2 000 = 4 000 Totaal gelezen blokken:
4 010
36
Ter vergelijking: slechts 1 buffer reserveren voor buitenste lus: EMPLOYEE
DEPARTMENT bD = 10
bE = 2000
EMPLOYEE in buitenste lus: elk blok wordt 1 x gelezen: 2 000
RESULTAAT
DEPARTMENT in binnenste lus: elk blok wordt telkens opnieuw gelezen bij volgende uitvoering van buitenste lus: 2 000 x 10 = 20 000 Totaal gelezen blokken:
22 000
37
DEPARTMENT
EMPLOYEE
bD = 10
bE = 2000
DEPARTMENT in buitenste lus: elk blok wordt 1 x gelezen: 10
RESULTAAT
EMPLOYEE in binnenste lus: elk blok wordt telkens opnieuw gelezen bij volgende uitvoering van buitenste lus: 10 x 2 000 = 20 000 Totaal gelezen blokken:
20 010
38
optimalisatie van joins • J1: geneste lussen – kies voor buitenste lus bestand met minst blokken (bv. R) – reserveer • 1 buffer voor bestand S in binnenste lus, • 1 voor uitvoerbestand, • zoveel mogelijk buffers voor bestand in buitenste lus – indien plaats voor nB buffers: nB - 2 buffers voor R
– per record van S : • vergelijk met alle R-records in buffers ("probing" van de buffers)
⇒ S moet in totaal even vaak overlopen worden als het aantal keren dat de buffers met nieuwe waarden voor R geladen worden
39
Voorbeeld (5): de diagrammen als formules • vb. join op EMPLOYEE en DEPARTMENT: OP6: EMPLOYEE ZY Dno = Dnumber DEPARTMENT – EMPLOYEE bevat bE blokken, DEPARTMENT bD – kiezen we EMPLOYEE voor buitenste lus: • aantal keren dat nB-2 blokken geladen worden van EMPLOYEE: ⎡bE / (nB-2) ⎤ • DEPARTMENT evenveel keren helemaal inlezen → in totaal bD * ⎡ bE/(nB-2) ⎤ blokken te lezen • totaal aantal blokken te lezen (EMPLOYEE en DEPARTMENT samen): bE + bD* ⎡ bE/(nB-2) ⎤ • bv. bE = 2 000, bD = 10, nB = 7 : 6 000 blokken
– kiezen we DEPARTMENT in buitenste lus: • bD + bE* ⎡ bD/(nB-2) ⎤ = 4 010 blokken
40
• J2: toegangsstructuur gebruiken om overeenkomstige records op te halen – indien secundaire indexen bestaan op beide bestanden: OP7: DEPARTMENT ZY Mgr_ssn = Ssn EMPLOYEE – join-selectiefactor van R m.b.t. R.A = S.B : • hoeveel records van S gemiddeld overeenkomen met een record van R (bij join op R.A = S.B) • vb: – # ( EMPLOYEE ) = 5 000 – # ( DEPARTMENT ) = 50 – join-selectiefactor van EMPLOYEE : 1 / 100 – join-selectiefacor van DEPARTMENT : 1
– bestand met hoge join-selectiefactor in buitenste lus • vermijdt dat veel "onnodige" records opgezocht worden
41
• vb.: – voor 50 departementen, 5 000 werknemers, bD=10, bE = 2 000 • elk departement heeft een manager → JSFD=1 • maar 50 van de 5 000 werknemers managen een departement → JSFE = 0.01 • zij aantal niveaus in indexen: xSsn = 4, xMgr_ssn = 2 • met EMPLOYEE in buitenste lus: – bE + (rE * (xMgr_ssn + 1) ) = 17 000 blokken • met DEPARTMENT in buitenste lus: – bD + (rD * (xSsn + 1) ) = 260 blokken 42
• J3: sort-merge join – is efficiënt • vb: zowel OP6 als OP7 – OP6: EMPLOYEE ZY Dno = Dnumber DEPARTMENT – OP7: DEPARTMENT ZY Mgr_ssn = Ssn EMPLOYEE vereisen – b E + bD bloktoegangen
– O (bR + bS), maar bestanden moeten geordend zijn – indien niet: eventueel eerst sorteren • externe sorteermethode toepassen • totale complexiteit: O(bR+ bS+ bR . log bR + bE . log bE) • kan efficiënter zijn dan vorige methodes
43
• J4: hash-join – eenvoudigst indien volledige hashtabel van een van de twee bestanden in intern geheugen past • stap 1: eerste bestand in geheugen brengen → tabel • stap 2: voor elk record van 2-de bestand nagaan met welke plaats in die tabel het overeenstemt
– Indien niet: meer gesofisticeerde implementaties • partition hash join: – eerst bestanden partitioneren met hash-functie h • verz. kleinere bestanden die volledig in intern geheugen passen – dan die bestanden 2 aan 2 joinen (met eender welke joinmethode, evt. J4 met andere hashfunctie) – tenslotte alle gejoinde bestanden aan elkaar hangen 44
R
alle records r van R met h(r.A)=4
hash
1
2
3
1
1
4
2
2
3
3
4
4
hash
S
alle records s van S met h(s.B)=4
45
– hybrid hash join: • • • •
variant van partition hash join idee: deel van join-fase tijdens partitie-fase al uitvoeren één van de tijdelijke hash-bestanden blijft permanent in geheugen spaart 2 tijdelijke bestanden uit
46
Projectie • π attribuutlijst(R) Als attribuutlijst – een sleutel van R bevat: • resultaat bevat evenveel tupels als R
– geen sleutel van R bevat: • resultaat kan dubbels bevatten • verwijderen : door sorteren of door hashing – na sorteren: dubbels komen na elkaar → gewoon niet kopiëren naar resultaat – hashing: tijdens projectie kijken of tupel al voorkomt in resultaat (via hashtabel); indien ja, niet toevoegen
47
48
Verzameling-operaties • Carthesisch product R x S: • zeer duur, resulteert in zeer grote relatie • zoveel mogelijk vermijden of vervangen door equivalente operaties tijdens optimalisatie
• Unie, doorsnede, verschil: • alleen voor unie-compatibele relaties (zelfde attributen)
– implementeren met sorteren of hashing • sorteren: – sorteer beide bestanden volgens zelfde attributen – daarna 1x lineair beide bestanden doorlopen • hashing: – records in beide bestanden naar zelfde hash-cellen hashen
49
T←R∪S
T←R∩S
T←R\S
50
Aggregatie-operaties • Indien dichte index op attribuut bestaat: resultaat kan zuiver uit index berekend worden – vb: SELECT MAX ( Salary ) FROM EMPLOYEE ;
– min: • volg steeds meest linkse wijzer in B+ - boom
– max: • steeds meest rechtse
– avg, count, sum: • doorloop bladeren van boom
51
Aggregatie-operaties • Group by: – vb: SELECT DNO, AVG ( Salary ) FROM EMPLOYEE GROUP BY DNO ;
– bestand eerst partitioneren in juiste groepen • d.m.v. sorteren of hashen
– aggregaatfunctie voor elke groep apart uitrekenen – opmerking: • bij cluster-index: bestand is reeds gepartitioneerd volgens clusterattribuut 52
Outer join • bv. left outer join – Wijziging aan standaard join implementatie: (bv. J1) • elk tupel van linker-relatie komt in resultaat voor • dus deze relatie gebruiken voor buitenste lus
– Alternatief: • eerst inner join berekenen • resultaat aanvullen met tupels die niet in inner join voorkomen (elk tupel aangevuld met nulls)
– bv. EMPLOYEE
Ssn = Mgr_ssn
DEPARTMENT
53
Operaties combineren met pijplijnen • probleem: – 1 query → meerdere operaties – voor elke opeenvolgende operatie apart tijdelijke bestanden aanmaken: duur!
• oplossing: – ⇒ meerdere operaties in één algoritme combineren • bv. selectie, dan join, tenslotte projectie • resultaat van selectie niet naar tijdelijk bestand schrijven maar direct als invoer aan join geven – pijplijn: gegevens stromen van een algoritme naar een ander
54
Agenda Overzicht Implementatie van operaties uit relationele algebra
Heuristische optimalisatie Systematische optimalisatie d.m.v. kostenschattingen
Semantische query-optimalisatie
55
Herhaling: A. Wat is slimmer? SELECT empname, projectname FROM emp, project WHERE emp.SSN = project.leaderSSN AND emp.income > 1000000
π emp.empname, project.projectname σ emp.income > 1000000 σ emp.SSN = project.leader.SSN
join emp.SSN = project.leaderSSN
σ emp.income > 1000000
X emp
π emp.empname, project.projectname
project
emp
project
56
Heuristische optimalisatie • Gebaseerd op "query trees" – een query-boom = een uitdrukking in relationele algebra • blad ↔ relatie • interne knoop ↔ operatie • bevat informatie over volgorde
– verschillende querybomen kunnen equivalent zijn m.b.t. resultaat (commutativiteit van operaties, ...) – vb: Q_2: • for every project located at ‘Stafford’, list the project number, the controlling department number, and the department manager’s last name, address, and birthdate • π Pnumber, Dnum, Lname, Address, Bdate ( ( ( σ Plocation = ‘Stafford’ ( PROJECT ) ) ZY Dnum = Dnumber ( DEPARTMENT ) ) ZY Mgr_ssn = Ssn ( EMPLOYEE ) ) • SELECT P.Pnumber, P.Dnum, E.Lname, E.Address, E.Bdate FROM PROJECT AS P, DEPARTMENT AS D, EMPLOYEE AS E WHERE P.Dnum = D.Dnumber AND D.Mgrssn = E.Ssn AND 57 P.Location = ‘Stafford’ ;
canonieke vorm: - geen joins, wel carth. prod - bovenaan: -σ
-π
58
Query-grafen • andere grafische voorstelling van query • geven geen volgorde aan • daardoor minder geschikt voor optimalisatie
59
• optimalisatie van queries op basis van bomen: – bouw een eerste boom in canonieke vorm: • σ, π, × (geen joins)
– herstructureer boom zonder equivalentie te verliezen • bv. twee opeenvolgende selecties omwisselen • op basis van heuristieken, zo dat query efficiënt uitgevoerd zal worden
– vb.: – Find the last names of employees born after 1957 who work on a project named ‘Aquarius’ – SELECT Lnamr FROM EMPLOYEE, WORKS_ON, PROJECT WHERE PName = ‘Aquarius’ AND PNumber = Pno AND Essn = Ssn AND Bdate > ‘1957-12-31’ ; 60
Initiële boom
61
Verplaats selectie operaties naar beneden
62
Plaats meest restrictieve selectie operaties eerst
Vervang carth. product door selectie en join operaties
63
Verplaats projecties naar beneden
64
Algemene transformatieregels – σ -cascade • selectie op conjunctie van condities omzetten in opeenvolgende eenvoudige selecties • σ c1 AND c2 AND … AND cn ( R ) ≡ σ c1 (σ c2 ( … (σ cn ( R ) ) … ) )
– commutativiteit van σ • σ c1 (σ c2 ( R ) ) ≡ σ c2 (σ c1 ( R ) )
– π -cascade • enkel laatste projectie overhouden • π list1 (π list2 ( … (π listn ( R ) ) … ) ) ≡ π list1 ( R )
– commutativiteit (onder voorwaarden) van σ met π • indien het selectiecriterium c enkel slaat op attributen A1, …, An uit de projectielijst • π A1, A2, …, An (σ c ( R ) ) ≡ σ c ( π A1, A2, …, An ( R ) )
65
– commutativiteit van ZY (of × ) • R ZY c S ≡ S ZY c R
– commutativiteit van σ met ZY (of × ) • σc (R ZY S) = σc (R) ZY S – indien enkel c enkel slaat op attributen van R • σc (R ZY S) = σ c1(R) ZY σ c2(S) – indien • c = c1 AND c2 , en • c1 en c2 condities zijn die enkel slaan op attributen van R resp. S)
– commutativiteit van π met ZY ( of × ) • indien alle join-attributen in projectielijst voorkomen: projectie kan naar binnen geschoven worden • anders: R en S projecteren op join-attributen + attributen in projectielijst • op het einde nogmaals projecteren op gevraagde attributen • bv. π A (R ZY B=C S) = π A(π A,B (R) ZY B = C π A,C (S))
66
– commutativiteit van verzameling-operaties • ∩ ∪ commuteren, \ niet
– – – –
associativiteit van ∩, ∪, ZY en × commutativiteit van σ met verzameling-operaties commutativiteit van π met verzameling-operaties diverse andere transformaties • bv. logische wetten van De Morgan
67
Heuristieken: algemeen • methode van optimalisatie: – bladeren en knopen van boom herschikken zodat query efficiënter wordt • naar beneden schuiven van operaties die best eerst uitgevoerd worden
• algemene regel: – voer eerst die bewerkingen uit die de grootte van tijdelijke relaties verminderen: • selectie zo snel mogelijk (→ minder tupels) • projectie zo snel mogelijk (→ minder attributen) • ⇒ deze naar beneden schuiven in boom
68
Heuristiken • Splits complexe selectie in meerdere eenvoudige selecties – geeft meer flexibiliteit bij herschikken
• Schuif selecties zo ver mogelijk naar beneden • Schuif bladeren waarop strenge selectie gebeurt zoveel mogelijk naar links – die geven kleinere relaties
• Vermijd zoveel mogelijk carthesische producten • Combineer carthesische producten met selectie tot een join • Schuif projecties zoveel mogelijk naar beneden – gooi onnodige attributen direct weg
• Identificeer deelbomen die door één algoritme kunnen uitgevoerd worden (zonder creatie van tijdelijke bestanden) 69
Uitvoeringsplan • Eens query-boom geoptimaliseerd: uitvoeringsplan bouwen – – – –
welke implementaties van joins etc. gebruiken? welke indexen gebruiken? ... "pipelined" vs. "materialised" evaluatie • materialised: tussenresultaat wordt gematerialiseerd in tijdelijk bestand • pipelined: vermijdt die tijdelijke bestanden
70
Voorbeeld van uitvoeringsplan voor query Q1:
SELECT FROM WHERE
Fname, Lname, Address EMPLOYEE, DEPARTMENT Dname = ‘Research’ AND Dnumber = DNO ;
Gebruik index voor selectie op DEPARTEMENT (als die bestaat) Gebruik geneste lussen voor join, (maar buitenste lus slechts 1-maal!) doorloop daarbij volledig EMPLOYEE bestand Doorloop resultaat van join voor projectie
71
Agenda Overzicht Implementatie van operaties uit relationele algebra
Heuristische optimalisatie Systematische optimalisatie d.m.v. kostenschattingen
Semantische query-optimalisatie
72
Systematische optimalisatie met kostenschattingen • Kosten om query uit te voeren: – – – – –
toegang tot hulpgeheugen (#blokken te lezen / schrijven) opslag van tijdelijke bestanden berekeningen gebruik van intern geheugen communicatiekost (query en resultaten oversturen van client naar server)
• Toegang tot hulpgeheugen weegt meestal door • Voorbeelden van kostenschattingen voor selectie en join: – zie eerder
73
Agenda Overzicht Implementatie van operaties uit relationele algebra
Heuristische optimalisatie Systematische optimalisatie d.m.v. kostenschattingen
Semantische query-optimalisatie
74
Semantische query-optimalisatie • Gebruik van extra kennis (in de vorm van restricties) om queries te transformeren • bv. : – stel dat een restrictie aangeeft dat geen werknemer meer verdient dan zijn overste; dan hoeft volgende query niet eens uitgevoerd te worden:
SELECT SELECT E.Lname, E.Lname, M.Lname M.Lname FROM EMPLOYEE AS FROM EMPLOYEE AS E, E, EMPLOYEE EMPLOYEE AS AS MM WHERE WHERE E.Super_ssn=M.Ssn E.Super_ssn=M.Ssn AND E.Salery>M.Salary; AND E.Salery>M.Salary;
75
Vooruitblijk Overzicht Implementatie van operaties uit relationele algebra
Heuristische optimalisatie Systematische optimalisatie d.m.v. kostenschattingen
Semantische query-optimalisatie Transactieverwerking 76
Bronnen • Deze slides zijn gebaseerd op Henk Olivié‘s slides voor Gegevensbanken 2009 en op Elmasri & Navathe, Fundamentals of Database Systems, Addison Wesley / Pearson, 5e editie 2007. • Alle kopieën zonder bronspecificatie: Elmasri & Navathe, Fundamentals of Database Systems, Addison Wesley / Pearson, 5e editie 2007. • Verdere figuren: bronnen zie “Powerpoint comments field” • Bedankt iedereen!
77