580 likes | 706 Views
Query Processing. Query processing. Van SQL-query naar resultaat Een kijkje onder de motorkap. Algebra ïsche operatoren. Klassieke dichotomie voor RA: sets or bags? Theorie van relationele databases: tabel is een set Praktijk (SQL): tabel is een bag.
E N D
Query processing Van SQL-query naar resultaat Een kijkje onder de motorkap
Algebraïscheoperatoren Klassieke dichotomie voor RA: sets or bags? Theorie van relationele databases: tabel is een set Praktijk (SQL): tabel is een bag R πB(R) πB(R)
Bags (multisets) versus sets Union {a,b,c} U {a,a,c,d} = {a,a,a,b,c,c,d} Intersection {a,a,a,b,c,c,d} ∩ {a,a,b,e} = {a,a,b} Difference (minus) {a,a,a,b,c,c,d} - {a,a,b,e} = {a,c,c,d}
Nieuwe operatoren: projectie Extended projectie R πA+B,A,A(R)
Nieuweoperatoren: sorteren τL(R) = lijst van tupels in R gesorteerd op attributen in L R τC,B↑(R)
Grouping en aggregate functions Trip Γwaar, min(prijs) (Trip)
Intermezzo • Describe how a Selection distributes over a Minus • Describe how a GroupBy distributes over a Union • Rewrite the following expression for schema R(ABCD), S(AEFG), T(EHK)
Access strategy • We gaan kijken naar datastructuren en algoritmen ten behoeve van het uitvoeren van algebraïsche operatoren • (Blok 4 INFODS) Algoritmische analyse in main memory: tel het aantal stappen van het programma ( := , < ) • Veralgemeniseer dit naar N, de lengte van de input • Onze benadering: tel het aantal keren dat disk access (IO) wordt gedaan en negeer de data processing in CPU en main memory
Hoe doe je … duplicate elimination? • methode 1: sorteren • externalsorting van R kan gedaan worden • via mergesort • methode 2: hashing • hash tupelsnaar table van M buckets • (daarvoorheb je M buffer pages nodig) • haal buckets éénvooréénnaar • main-memory en verwijderduplicaten • IO: 3 * B, met B = het aantal blocks nodig om R • op te slaan
Hoe doe je … een selectie? • S := σA1 = C1, …, An = Cn (R) • Verschillende access-paden • Scan de geheletabel en check de condities • tupelgewijs • Gebruikeen index waarvan het attribuut • bevat is in A1,…, An
Hoe doe je … een selectie? • S := σA1 = C1, …, An = Cn (R) • Stel je hebtmeerderegoedeaccesspaden • (bijv. twee indexen) • Optie 1:gebruik het meestselectieve • access-pad • Optie 2: gebruik twee (of meer) access- • paden en bereken de intersectie
Statistics voorkostenschattingen • T(R): het aantal tuples van R • B(R): het aantal blocks van R • V(R,A): het aantalverschillende • waarden van attribuut A in R • Uitdaging: doorrekenen effecten van algebraïsche • operatoren voor statistics van tussenresultaten
Statistics voorkostenschattingen R’ := σA=c (R) T(R’) = … T(R’) = T(R)/V(R,A) Veronderstelling: homogene verdeling waarden domein(A) Nauwkeuriger: histogrammen Prijskaartje: onderhoud Alternatief: sampling
Statistics voorkostenschattingen • U := R S θ: R.A = S.A • T(U) = … • T(U) = T(R)*T(S)/V(S,A) • T(U) = T(S)*T(R)/V(R,A) • Kies minimum van beide ?!
Hoe doe je … een join? • T := R S θ: R.A = S.A
Hoe doe je … een join? • T := R S θ: R.A = S.A • Tuple nested-loop • Block-nested loop • Index-nested loop • Sort-Merge • Hash-Join • Buffer: M pages/blocks
Hoe doe je … een join? • Block-nested loop • S = smallestrelation (nr of blocks) • foreachchunk van M-1 blocks van S do • lees deze blocks in main memory; • foreachblock B2 van R do { • lees B2 in overgeblevenbufferblok; • check allemogelijkecombinaties • van tupels t1 in chunk en t2 in B2; • als t1.A = t2.A, schrijfdan de join van deze tuples naar output • } • IO: B(S) + B(R) *┌ B(S)/(M-1)┐
Hoe doe je … een join? • Index-nested loop • aanname: index op S.A • foreach block B van R do • foreach tupel t in B do { • stel t.A = a; • gebruik de index om alle t2 in S • te zoeken met t2.A = a; • schrijf de join van t met elke t2 weg; • }
Hoe doe je … een join? • Index-nested loop • c = kosten access via index (~2 voor B-tree) • μ= gem. aantal gevonden tupels (schatten uit statistics) • IO: B(R) + (c + μ) T(R) • μ ~= T(S)/V(S,A) • Als A key is in S: μ = 1
Hoe doe je … een join? • Sort-merge • (Indien nodig) sorteer R op A • (Indien nodig) sorteer S op A • repeat • vul de buffer met de blocks van • R en S die de kleinste gemeenschappelijke waarde voor R.A en S.A bevatten; • join de tupels in deze blocks; • until restant R of restant S leeg
Hoe doe je … een join? • Sort-merge
Hoe doe je … een join? • Hash Join • Kies een hash-functie voor het domein van A • Kies de grootte M van de hash-table • Hash elk tupel van R naar het corresponderende bucket • Hash elk tupel van S naar het corresponderende bucket • Haal elk bucket naar main-memory en construeer de resultaat-tupels
Hash Join on A Bucket: h(a) = 0 Bucket: h(a) = 1 Bucket: h(a) = 2
Hash Join on A Bucket: h(a) = 0 Join each bucket in main memory: Bucket: h(a) = 1 adds: Bucket: h(a) = 2
Join each bucket in main memory: Bucket: h(a) = 0 Bucket: h(a) = 1 adds: Bucket: h(a) = 2