Dotazovací jazyk pro řazená data NDBI006 2011 Martin Chytil
Motivace - dotazy závislé na pořadí Úvod do jazyka AQuery Datový model Algebra Transformace dotazů - optimalizace Výsledky experimentů Podobné projekty Shrnutí
Výsledek dotazu se změní jiným uspořádáním vstupu Všechny nabídky dané akcie během dne Pěti-cenový klouzavý průměr Finanční svět, molekulární biologie, toky paketů v síti
Relační databáze pomocí doplňků Složité formulace jednoduchých dotazů Obtížná optimalizace
Schéma: Obchod(ID, datum, cena, časové_razítko) Dotaz: Pro danou akcii v daném dni najít nejlepší možný zisk
SELECT max(rozdíl) FROM (SELECT ID, datum, cena min(cena) OVER (PARTITION BY ID, datum ORDER BY časové_razítko ROWS UNBOUNDED PRECEDING) AS rozdíl, FROM Obchod ) AS t1 WHERE ID = 'ACME' AND datum = '05/11/03'
Schéma: Paket(ID, zdroj, cíl, délka, časové razítko) Dotaz: Počet paketů a průměrná délka paketů v každém datovém toku
WITH Předchozí (zdroj, cíl, délka, čr, pč) AS (SELECT zdroj, cíl, délka, čr, min(čr) OVER (PARTITION BY zdroj,cíl ORDER BY čr ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) FROM Paket), Tok (zdroj, cíl, délka, čr, flag) AS (SELECT zdroj, cíl, délka, čr, CASE WHEN čr-pč > 120 THEN 1 ELSE 0 END FROM Předchozí), TokID (zdroj, cíl, délka, čr, tid) AS (SELECT zdroj, cíl, délka, čr, sum(flag) OVER (ORDER BY zdroj, cíl, čr ROWS UNBOUNDED PRECEDING) FROM Tok) SELECT zdroj, cíl, avg(délka), count(čr) FROM TokID GROUP BY zdroj, cíl, tid
Podpora uspořádní na nejnižších základech Sémantické rozšíření relační algebry (SQL 92) Klauzule ASSUMING ORDER Arrable Základní datový typ Setříděná entita
Τ množina typů, každý t Τ je základního typu (integer, boolean, ) nebo jednodimensionální pole elementů základního typu. A neomezeně velké ale konečné pole elementů t Τ Kardinalita A = A = počet jeho prvků A,k- = k -tý element A (k = index / pozice)
Arrable r = kolekce pojmenovaných polí A 1, A 2,, A n, A 1 = A 2 = = A n, A i, 1 i n, je typu t Τ
Obchod ID Datum Cena ČR ACME 5.11.2003 12.02 1 WXYZ 5.11.2003 43.23 2 ACME 5.11.2003 12.04 5 ACME 5.11.2003 12.05 9 WXYZ 5.11.2003 43.22 13 Sada ID Datum Cena ČR ACME 5.11.2003 [12.02, 12.04, 12.05] [1, 5, 9] WXYZ 5.11.2003 [43.22, 43.23] [2, 13]
k tý záznam Arrable r r k = < A 1 k, A 2 k,, A n k > Indexace začíná od 0 Arrable je složen z uspořádaných polí arrable je uspořádaný
r(a 1,, A n ) arrable Arrable může být uspořádaný podle podmnožiny polí, ze kterých je složen B 1, B 2,, B m A 1, A 2,, A n, k 1, k 2 indexy, k 1 < k 2 i) B 1 k 1 = B 1 k 2,, B m k 1 = B m k 2 ii) i B i k 1 < B i k 2, Pro i > 1, B 1 k 1 = B 1 k 2,, B i 1 k 1 = B i 1 k 2 Pro sestupné uspořádání symetricky
r a s dva arrable nad stejnou množinou atributů r je ORDERED BY X 1,, X p, s je ORDERED BY Y 1,, Y q pak r a s jsou Order-ekvivalentní nad B 1,, B m, pokud: i) r a s jsou množinově ekvivalentní ii) B 1,, B m je prefixem X 1,, X p a Y 1,, Y q Značíme r B1,,B m s, r *+ s
V dotazech závislých na pořadí výsledek závisí na kombinaci více než jednoho vstupního záznamu AQuery se vyznačuje sémantikou zaměřenou na sloupce jednotlivé proměnné se vážou na celé své pole Výrazy definují mapování ze seznamu polí do pole
Funkce bere jako argument vektor a vrací vektor AQuery obsahuje spoustu takových funkcí Př. Prev, Next, Funkce se klasifikují podle vztahu k uspořádání vstupního pole a ke kardinalitě pole, kterou generují (Ne)závislé na uspořádání, (ne)zachovávající velikost
Výraz e je nezávislý na uspořádání, pokud: A i, 1 i m kde m je stupeň výrazu a pro libovolnou permutaci perm platí: e(a 1,, A m ) *+ e(a 1 Perm,, A m Perm ) Jinak je závislý na uspořádání
Trochu jiné Vector-to-vector funkce závislé na pořadí, zachovávající velikost Klouzavé minimum mins A i = min (A i, mins A i 1 ) mins A = 0 < i < A A i, i = 0 Klouzavá suma sums A i = A i + sums A i 1 ) sums A = 0 < i < A A i, i = 0
Např. first A,n = A,0.. n 1- last A,n = A, A n.. A 1- Pokud se takové funkce drží kraje pole, označují se jako hraniční funkce a mají specifický význam při optimalizaci
Podporuje operátory relační algebry Jako argumenty se používají pole Pokud je výraz závislý na uspořádání, pak operátor také zachovává uspořádání
r je Arrable e = e 1,, e m je seznam výrazů nad poli arrablu r, tž. e 1 = = e m Pořadí zachovávající projekce r nad e π op e r projection(e, r) 1. s empty arrable aving te same scema as e 2. for i = 0 to r 1 3. append < e 1 i,, e m i > to s 4. end for 5. output s
r je Arrable p predikát mapující pole r do pole boolean tž. r = p Pořadí zachovávající selekce r přes p σ op p r selection(p, r) 1. s empty arrable aving te same scema as r 2. for i = 0 to r 1 3. if p i is true 4. append r i to s 5. end if 6. end for 7. output s
r(a 1,, A m ) arrable B 1, B 2,, B m A 1, A 2,, A n Setřídění r podle B 1, B 2,, B m znamená permutaci s arrablu r takovou, že s(r) je ORDERED BY B 1, B 2, B m sort B1,B 2,,B m (r)
Schéma: Obchod(ID, datum, cena, časové_razítko) Dotaz: Pro danou akcii v daném dni najít nejlepší možný zisk
SELECT max(cena - mins(cena)) FROM Obchod ASSUMING ORDER časové_razítko WHERE ID = 'ACME' AND datum = '05/11/03 π e op (σ p op (sort cr (Obcod))), e = max cena mins cena, p = (ID = ACME ) (datum = 05/11/03 )
AQuery: SELECT max(cena - mins(cena)) FROM Obchod ASSUMING ORDER časové_razítko WHERE ID = 'ACME' AND datum = '05/11/03' SQL99: SELECT max(rozdíl) FROM (SELECT ID, datum, cena min(cena) OVER (PARTITION BY ID, datum ORDER BY časové_razítko ROWS UNBOUNDED PRECEDING) AS rozdíl, FROM Obchod ) AS t1 WHERE ID = 'ACME' AND datum = '05/11/03'
r je Arrable g = G 1,, G m je seznam výrazů nad poli arrablu r, tž. G 1 = = G m = r, Pro každé r i existuje skupina charakterizovaná g i Pořadí zachovávající group-by r nad g gby g op r
group-by(g,r) 1. groups := empty arrable having the same schema as g 2. s:= empty arrable having the same schema as r 3. for i = 0 to r -1 4. if g[i] in groups 5. j:= index of g[i] in groups 6. for each column C in r 7. if C is not a grouped-by column 8. concat r[i].c to s[j].c 9. end if 10. end for 11. else 12. append g[i] to groups 13. append r[i] to s 14. end if 15.end for 16.output s
Obchod ID Datum Cena ČR ACME 5.11.2003 12.02 1 WXYZ 5.11.2003 43.23 2 ACME 5.11.2003 12.04 5 ACME 5.11.2003 12.05 9 WXYZ 5.11.2003 43.22 13 Sada ID Datum Cena ČR ACME 5.11.2003 [12.02, 12.04, 12.05] [1, 5, 9] WXYZ 5.11.2003 [43.22, 43.23] [2, 13]
A pole, parametr funkce F Each(F, A) 1. B := empty array of the same type of F's result 2. for i = 0 to A -1 3. append F(A[i]) to B 4. end for 5. output B
Schéma: Paket(ID, zdroj, cíl, délka, časové razítko) Dotaz: Počet paketů a průměrná délka paketů v každém datovém toku
SELECT zdroj, cíl, avg(délka), count(čr) FROM Paket ASSUMING ORDER zdroj, cíl, čr GROUP BY zdroj, cíl, sums(deltas(čr) > 120) π e each (gby g op (sort zdroj,cíl,cr (Paket))), e = zdroj, cíl, each avg(), délka, each(count(), cr), g = zdroj, cíl, sums(deltas cr > 120)
AQUERY: SELECT zdroj, cíl, avg(délka), count(čr) FROM Paket ASSUMING ORDER zdroj, cíl, čr GROUP BY zdroj, cíl, sums(deltas(čr) > 120) SQL99: WITH Předchozí (zdroj, cíl, délka, čr, pč) AS (SELECT zdroj, cíl, délka, čr, min(čr) OVER (PARTITION BY zdroj,cíl ORDER BY čr ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) FROM Paket), Tok (zdroj, cíl, délka, čr, flag) AS (SELECT zdroj, cíl, délka, čr, CASE WHEN čr-pč > 120 THEN 1 ELSE 0 END FROM Předchozí), TokID (zdroj, cíl, délka, čr, tid) AS (SELECT zdroj, cíl, délka, čr, sum(flag) OVER (ORDER BY zdroj, cíl, čr ROWS UNBOUNDED PRECEDING) FROM Tok) SELECT zdroj, cíl, avg(délka), count(čr) FROM TokID GROUP BY zdroj, cíl, tid
r A 1,, A n, s B 1,, B m jsou arrably Levě-pravé spojení r a s pomocí predikátu p zachovávající uspořádání r p lrop s
join(p, r, s) 1. o:= empty arrable with schema < A 1,, A n, B 1,, B m > 2. for i = 0 to r - 1 3. for j = 0 to s - 1 4. if p(r[i],s[j]) is true 5. Append < A 1,i-,, A n,i-, B 1,j-,, B m,j- >to o 6. end if 7. end for 8. end for 9. output o
order r = seznam atributů, podle kterých je arrable r implicitně setříděn, tzn. ORDERED BY Můžeme použít pos r odkazujeme na r i = i, pokud se Speciální indexy FIRST a LAST
sort A r order r r, A je prefix order r Nemusím třídit setříděné
σ p op sort A r A sort A σ p r, p není závislé na uspořádání Můžu posunout třídění až za selekci Selekce může těžit z případného existujícího uspořádání Můžu třídit menší množinu záznamů
π op e,i- r order(r) π op e σ pos()=i r Nahrazení projekce s indexem čistou projekcí a konkrétní selekcí na určitou pozici Takové projekce se nazývají implicitní selekce Pokud je pozice na krajích operandu (pole) Hraniční selekce S takovou selekcí mohu posunovat Není potřeba třídit celý vstup
Fyzický operátor AQuery Implementuje obecný vzor hraniční selekce op σ edge cond sort r Používá modifikaci heapsortu k udržení správných elementů
sort A (r A=B s) A sort A r A, B scema r, s lop A=B s, Třídění výsledku spojení je ekvivalentní setřídění levé strany a následného spojení zachovávající uspořádání Stačí třídit až výsledek spojení
op σ A=B,i- r order(r) r A=B σ pos()=i r, A, B scema r Využití výhody implicitního třídění na arrable r Využití self-join Můžeme manipulovat s každou částí různě
σ p op r lop A=B s order r σ op p (σ each p gby A r lop A=B s, A, B scema r, s, p je pos() = FIRST or pos() = LAST, B je unikátní Optimalizace hraniční selekce po spojení Nemusím spojovat všechno, hraniční selekce toho dost vyloučí
Fyzický operátor Implementuje obecný vzor each σ edge cond gby r Silně optimalizovatelný vzor Nemusím seskupovat všechno, operátor velmi rychle dokáže vyloučit záznamy nevyhovující hraniční podmínce
gby A op (sort A,B r ) A,B sort B each (gby A op r ) Výsledek musí být setříděný podle seskupovaných atributů (zachování uspořádání) Seskupování musí probíhat přes prefix tříděných atributů Myšlenka: Třídění probíhá až uvnitř každých seskupení je jich méně, bude to rychlejší
Motivační příklad 1: Počet akcií 200 1000 1000 obchodů / akcie Zlepšení roste s počtem akcií!!! 8 21 x lepší než SQL99 Důvod: protláčení selekce před tříděním SQL99 nemůže posunovat selekci, plán generuje n- tice, které zahazuje
Motivační příklad 2 100 sessions Různé délky paketů 2K 10K Zlepšení 2 3x proti SQL99 AQuery používá pouze jedno třídění SQL99 si nedokáže poradit se dvěmi nesouvisejícími WINDOW vede ke dvou odlišným tříděním ještě před GROUP BY
1 milion obchodů s akciemi Postupně rovnoměrně rozděleno mezi 10, 100, 1000 a 10000 akcií Čím více záznamů může Edgeby zahodit, tím rychlejší Průměrně 2x rychlejší než provedení standardního GROUP BY přes celou tabulku
1 mil. Obchodů s akciemi Rozděleno do proměnlivého množství akcií Třídění v seskupených záznamech vychází vždy lépe Do 10 různých akcií je zlepšení v 10-kách ms Nad 10 ve 100-kách ms!!!
Využití Sort Edge Jednotky ms Nevyužití Sort Edge 100-ky ms Rozdíl jsou 100-ky ms!!!!!
Využití semi-join k redukci záznamů určených ke třídění Zlepšení se zastavilo na 100 a více unikátních záznamech určených ke třídění Došlo k situaci, že cena za semi-join začala převyšovat cenu za třídění
Strukturální jednoduchost AQuery pomáhá optimalizátoru najít vhodnější plán provedení Redukce práce s využitím Sort Edge a Sort Embedding je VELMI výrazná Transformace dotazů přináší podstatné zlepšení výkonu, zejména při optimalizacích ceny dotazů
AQuery je následovníkem KSQL Přebírá ze základů KSQL pojem Arrable Snaží se více udržet SQL základy Zavádí pouze jednoduchou klauzuli ASSUMING ORDER
Pouze doplňkové optimalizace, bez většího efektu Optimalizační kroky jsou stále oddělené, transformace obsahující redukci / eliminaci třídění nejsou uvažovány při jiných algebraických transformacích
Dotazy závislé na uspořádání vstupních dat AQuery dotazovací jazyk pro takové dotazy Datový model a algebra jazyka Optimalizační kroky Výsledky experimentů
Alberto Lerner, Dennis Shasha: AQuery: Query Language for Ordered Data, Optimization Techniques, and Experiments