SQL Spreadsheet Jakub Čermák jakub@jcermak.cz
Agenda Úvod, OLAP, Spreadsheet Rozšíření jazyka SQL pro spreadsheety Parametrizace Implementace Analýza a optimalizace dotazu Datová struktura, vyhodnocení Výkonnost
OLTP, OLAP Online transaction processing např. relační databáze zaměřena na snadnou modifikaci ve víceuživatelském prostředí uchovává jednotlivé relace Online Analytical Processing analýza (obchodních trendů) velkých objemů dat mnohem (1000x) rychlejší než OLTP uchovávání agregací namísto jednotlivých záznamů, přímý přístup přes indexy
OLAP kostka Tabulka faktů (fact table) vícedimenzionální tabulka s daty buňky (cell) jsou adresovatelné (očíslované), na rozdíl od relací Measures jednotlivé hodnoty (označené dimenzemi) Dimenze (dimension) Popisky measures Příklad: f(t, r, p,s,c) time, region, product sales, cost
Spreadsheet př. Microsoft Excel pro analýzu obchodních dat vhodnější než SQL databáze přímé adresování prvků, podpora formulí, dobré UI Ale pouze 2D (řádek, sloupec) málo škálovatelné
SQL Spreadsheet rozšíření standardu SQL pro práci s ochodními daty a provádění analýz Oproti SQL adresování dimenzemi, relace jsou n- dimenzionální pole podpora formulí, dopočítávání hodnot snazší zápis, vyšší efektivita OLAP analýz rekurzivní a cyklické formule Oproti Spreasheetu n-dimenzionální lépe škálovatelný, mnohem výkonnější, větší podpora funkcí
Agenda Úvod, OLAP, Spreadsheet Rozšíření jazyka SQL pro spreadsheety Parametrizace Implementace Analýza a optimalizace dotazu Datová struktura, vyhodnocení Výkonnost
Definice PARTITION column (PBY) rozdělení dat do disjunktních podmnožin (partitions) podmnožiny uplně nezávislé, prostor pro optimalizace DIMENSION column (DBY) popisky dat, unikátní identifikace buňky v dané partition MEASURES column (MEA) vlasní data Příklad: f(t, r, p,s,c) time, region, product; sales, cost
Syntaxe spreadsheet clause <existing parts of a query block> SPREADSHEET PBY(cols) DBY(cols) MEA(cols) <processing options> (<formula>,<formula>,..,<formula>)
Příklad SELECT r,p,t,s FROM f SPREADSHEET PBY(r) DBY(p,t) MEA(s) ( s[p= dvd,t=2002]=s[p= dvd,t=2001]*1.6, s[p= vcr,t=2002]= s[p= vcr,t=2000]+s[p= vcr,t=2001], s[p= tv,t=2002]=avg(s)[p= tv,1992<t<2002] ) SPREADSHEET PBY(r) DBY(p,t) MEA(s) ( s[ vcr,t<2002] = avg(s)[ vcr, cv(t)-2<=t<cv(t)] ) current value
UPDATE / UPSERT Mějme s[ vcr,t=2002] = Co když daná buňka neexistuje? UPSERT mode (výchozí) UPSERT s[ vcr,t=2002] = vytvoří buňku pokud neexistuje, jinak update UPDATE mode UPDATE s[ vcr,t=2002] = ignoruje neexistující buňky Ale co udělá UPSERT s[ tv, *]?
Calculated member Nová dimenze, která není ve fact table; hodnoty se vypočítávají formulí Příklad SPREADSHEET PBY(r) DBY(p,t) MEA(s) (UPSERT s[ tv,*]=s[ black-tv, cv()] + s[ white-tv,cv()]) Je zkratkou za Konstanta UPSERT s[ tv,for t IN (SELECT DISTINCT t FROM input set)] = NULL, UPDATE s[ tv,*]=s[ black-tv,cv()] + s[ white-tv,cv()]
Referenční spreadsheety Mám tabulku s jinou dimensionalitou př. budget allocation (region, prediction) Readonly přístup k jiným tabulkám během počítání Obdoba relačního JOINu rychlejší, optimalizovanější
Referenční spreadsheety př. SELECT r,t,s FROM f GROUP BY r,t SPREADSHEET REFERENCE budget ON (SELECT r,p FROM budget) DBY(r) MEA(p) DBY(r,t) MEA(s) ( s[ west,2002]=p[ west ]*s[ west,2001], s[ east,2002]= s[ east,2001]+s[ east,2000] )
Řazení Řazení vyhodnocování jednotlivých buňek Pokud je výpočet závislý na minulých hodnotách s[ vcr,t<2002] = avg(s)[ vcr, cv(t)-2<=t<cv(t)] ORDER BY s[ vcr,t<2002] ORDER BY t ASC= avg(s)[ vcr, cv(t)-2<=t<cv(t)] Řazení vyhodnocování formulí Při závislostech jednotlivých formulí na sobě (např. součet prodejů typů TV a pak součet všech TV + DVD) Pro acyklické smečky formulá Automatické v lexikografickém pořadí SEQUENTIAL ORDER podle pořadí uvedení
Cykly a rekurze Formule jsou na sobě cyklicky závislé Nelze vyhodnocovat napoprvé př. s[1] = s[1] / 2 Omezení (výpočet běží jedna nenastane) na počet iterací na bool podmínku Funkce PREVIOUS minulá hodnota SPREADSHEET DBY(x) MEA(s) ITERATE(10) UNTIL (PREVIOUS(s[1])-s[1] <= 1) (s[1]=s[1]/2)
Cyklus př. SELECT account,b FROM SPREADSHEET DBY(account) MEA(balanceb) RULES IGNORE NAV ITERATE(100) UNTIL(ABS(b[ net ]-PREVIOUS(b[ net ]))<0.01) ( F1:b[ interest ]=b[ net ]*0.30, F2:b[ net ]=b[ salary ]+b[ capitalgains ] - b[ interest ]-b[ tax ], F3:b[ tax ]=(b[ salary ]-b[ interest ])*0.38 + b[ capitalgains ]*0.28 )
Další instrukce ITERATE, AUTOMATIC SEQUENTIAL ORDER nastavení UPSERT/UPDATE mode jako default IGNORE NAV považuj NULL za 0 pro aritmetické operace
Změny tabulky faktů Ve výchozím použití NEUPRAVUJE původní relaci (ani UPSERT) MERGE propagace vypočítaných buňek zpět do relace
Změny tabulky faktů př. MERGE INTO f USING ( SELECT r,p,t,s FROM f SPREADSHEET PBY(r) DBY(p,t) MEA(s) ( UPSERT s[ tv,*]=s[ black-tv,cv()] + s[ white-tv,cv()] ) ) v ON f.r = v.r AND f.p = v.p AND f.t = v.t WHEN MATCHED THEN UPDATE SET f.s=v.s WHEN NOT MATCHED THEN INSERT VALUES(v.r, v.p, v.t, v.s)
Agenda Úvod, OLAP, Spreadsheet Rozšíření jazyka SQL pro spreadsheety Parametrizace Implementace Analýza a optimalizace dotazu Datová struktura, vyhodnocení Výkonnost
Parametrizace SQL bloků Vytváření uložených funkcí pouze deklarativní (SQL) příkazy (narozdíl od Oracle, MSSQL) Silně typové funkce X slabě typové fce kontrola typů při vytváření X spuštění slabě typové: ANYTYPE jako typ Při vykonávání se dosadí do vnějšího dotazu možnost optimalizace mezi dotazy
Příklad CREATE FUNCTION region_sales_2002 (f TABLE OF ROW(r VARCHAR,p VARCHAR,t INT,s NUMBER), region VARCHAR) RETURN MULTISET LANGUAGE SQL AS SELECT r,p,t,s FROM f_param f WHERE r = region SPREADSHEET PBY(r) DBY(p,t) MEA(s) ( s[ vcr,2002]=s[ vcr,1998]+s[ vcr,1999], s[ dvd,2002]=avg(s)[ dvd,1990<t< 2001], s[*,2003]=s[cv(p),2002]*1.2 ) SELECT r,p,t,s FROM region_sales_2002 ((SELECT reg,prod,time,sale FROM t), west ) WHERE p= tv ;
Param. SQL Spreadsheet clause Vytváření uložených procedur přijímající už spreadsheet (rozdělený na PBY, DBY, MEA) neboli vícedimenzionální pole srovnej: předchozí přijímá relace obsahující pouze spreadsheet klauzuli srovnej: předchozí obsahuje SQL příkazy
Příklad CREATE PROCEDURE net_present_value (ARRAY DBY(i IN INTEGER) MEA(amount IN NUMBER,npv OUT NUMBER), rate NUMBER) LANGUAGE SQLSPREADSHEET AS RULES IGNORE NAV ( npv[1]=amount[1], npv[i>1] ORDER BY i = amount[cv(i)/power(1+rate,cv(i)]+ npv[cv(i)-1] )
Volání Přetypování 2D pole s jednou dimenzí konstantní ([ vcr, *]) pokud tvar pole je kompatibilní s tvarem spreadsheetu implicitní (defaultní) přetypování znovupoužití datových struktur => levné Volání ze spreadsheet bloku vyber MEA amount a npv a vytvoř 2D pole (pořád adresované všemi DBY sloupci) SELECT year,i,prod,amount,npv FROM cash_flow SPREADSHEET DBY(prod,i) MEA(year,s,NULL npv) ( net_present_value((amount,npv)[ vcr,*],0.14), net_present_value((amount,npv)[ dvd,*],0.14) )
Agenda Úvod, OLAP, Spreadsheet Rozšíření jazyka SQL pro spreadsheety Parametrizace Implementace Analýza a optimalizace dotazu Datová struktura, vyhodnocení Výkonnost
Evaluation overview 3 fáze analýza a optimalizace graf závislostí formulí definice oboru (scope) dotazu transformace formulí, přesuny a optimalizace predikátů... tvorba datové struktury random access struktura (hash tabulka, ale možné i jiné implementace) vyhodnocení formulí 3 různé algoritmy
Agenda Úvod, OLAP, Spreadsheet Rozšíření jazyka SQL pro spreadsheety Parametrizace Implementace Analýza a optimalizace dotazu Datová struktura, vyhodnocení Výkonnost
1. Graf závislostí orientovaný graf, vrcholy jsou formule, hrany jsou závislosti formulí R(F) buňky referencované na pravé straně L(F) buňky modifikované na levé straně Formule F1 závisí na F2 (F2 -> F1) právě tehdy když R(F1) má neprázdný průnik s L(F2) Složité formule: předpoklad, že referencují vše sestavení částečného uspořádání formulí rozdělení formulí do úrovní formule závisí pouze na těch z nižší úrovně
1. Graf závislostí (2) Zjištění cykličnosti grafu (výběr algoritmů) Nezávislé formule lze vyhodnocovat současně Závislé se musí vyhodnocovat popořadě Počet úrovní = minimální počet scanů lze dosáhnout pro acyklický graf Izolování acyklických částí grafu optimalizace (acykl. alg. jsou rychlejší) Pro sekvenční vyhodnocování pořadí je pevně dané, ale graf se generuje pro minimalizaci počtu scanů
2. Prořezání (pruning) formulí Vyhození formulí, které nakonec nebudou potřeba Definice: hodnota není využitá žádné další formuli změněné buňky jsou vyfiltrovány vnějším dotazovacím blokem nebo nejsou referencovány ve vnějším bloku Algoritmus sink node takový, ze kterého nevedou hrany FS <- množina všech sink nodes WHILE (FS is not empty), vyber Fi IF (Fi splňuje definici): vyhoď Fi z množiny formulí vyhození může generovat nové sink nodes, ty je třeba přidat do FS
Příklad SELECT * FROM ( SELECT r, p, t, s FROM f SPREADSHEET PBY(r) DBY(p,t) MEA(s) UPDATE ( F1:s[ dvd,2000]=s[ dvd,1999]*1.2, F2:s[ vcr,2000]=s[ vcr,1998]+s[ vcr,1999], F3:s[ tv,2000]=avg(s)[ tv,1990<t<2000] ) ) WHERE pin( dvd, vcr, video )
3. Přepis formulí Snížení počtu přepisů omezením podmínek SELECT * FROM ( SELECT r,p,t,s FROM f SPREADSHEET PBY(r) DBY(p,t) MEA(s,c) UPDATE ( F1:s[*,2002]=c[cv(p),2002]*2, ) ) WHERE pin( dvd, vcr ) and t 2000; F1 může být vyhodnocena jen pro F1 :s[pin( dvd, vcr ),2002]=c[cv(p),2002]*2 Výhodné spojit s předchozím krokem (generuje nové sink nodes)
4. Predicate pushing posun PBY predikátů mezi vnitřním a vnějším blokem vždy správné, filtrujeme celé partitiony posun mezi nezávislými dimenzemi nezávislá dimenze d na levé i pravé straně formule má vždy stejnou hodnotu na d lze nahlížet jako na PBY ohraničující obdélník (bounding rectangle) rozsah dimenzí v dané formuli, zarovnaný na čtverec pro dotaz: sjednocení ohraničujících obdélníků všech formulí tyto spojené predikáty lze také posouvat
5. optimalizace agregací SELECT r,p,t,s,ps FROM t SPREADSHEET PBY(r) DBY(p,t) MEA(s,t,0 ps) UPDATE ( ps[*,*]=s[cv(p),cv(t)-1]* (1+slope(s,t)[cv(p),cv(t)-5<=t<=cv(t)-1]) ) naivní implementace: moc scanů díky agregaci nalevo lze nahradit klouzavou funkcí operuje nad klouzavým (sliding) oknem nativní implementace v Oracle: slope(s,t) OVER (PARTITION BY p ORDER BY t RANGE BETWEEN 5 PRECEDING AND 1 PRECEDING)
5. optimalizace agregací fce slope je tvořena fcemi count() a sum() a tedy spadá do kategorie algebraických agregací, které lze takto přepsat obecně lze použít pokud: formula není samo cyklická 1 dim. agr. fce definuje okno relativní k cv() a ostatní dim. jsou kvalifikovány hodnotami z cv()
6. Opt. kvalifikovaných agregací agregace adresovaná přes diskrétní dimenzi (1<i<6) lze nahradit přímým přístupem ({2,3,4,5}) 1. přístup vyžaduje plný scan existenční agregace 2. přístup vyžaduje málo náhodných přístupů kvalifikovaná agregace struktury jsou optimalizované pro náhodný přístup Efektivita:
Příklad SPREADSHEET DBY(p,t) MEA(s,0 mavg) ( mavg[ dvd,for t FROM 2000 TO 2001]= 1.05*AVG(s)[cv(),cv()-3<=t<=cv()-1] ) mavg[ dvd,for t FROM 2000 TO 2001]= 1.05*AVG(s)[cv(),FOR t FROM cv()-3 TO cv()-1 INCREMENT 1]
Agenda Úvod, OLAP, Spreadsheet Rozšíření jazyka SQL pro spreadsheety Parametrizace Implementace Analýza a optimalizace dotazu Datová struktura, vyhodnocení Výkonnost
Tvorba datové struktury mapování řádků do vícedimenzionální struktury podpora: náhodný přístup, efektivní přidávání 2úrovňová hashovací struktura hash partition na základě PBY sloupců 2. úroveň na základě PBY&DBY sloupců efektivní vyhodnocení, minimalizace paměti velikost podle ohraničujícího obdélníku a dostupné paměti (dvojnásobek) kolize vytváření řetězců
Datová struktura (2) disková hash cache při nedostatku paměti minimalizace počtu zápisů na disk (LRU, dirty flagy,...) podporované operace probe, update, upsert, insert, scans (podle DBY)
Vykonávání 3 algoritmy
Auto-acyklický alg. Pro acyklické dotazy (nebo jejich části) Procházení podle úrovní (dependency graph) pro každou partition (PBY) a úroveň pro každý záznam: spočítej agregaci (1 scan) vyhodnoť jednoduché (bez existenčních podm. vlevo) formule (žádný scan) pro každý záznam (scan) najdi existeční formule (EF) pro daný záznam pro každý záznam (scan) a spočítej každou agregaci z EF vyhodnoť EF
Auto-cyklický alg. pro formule s cykly nebo mají příliš komplexní predikáty 1. vytvoření silně souvislých komponent podle grafu závislostí 2. nessc formule vyhodnoť jako acyklické 3. formule v SSC vyhodnoť max. Nkrát při konvergenci se zastaví N = počet buňek upserted nebo updated v 1. iteraci acykl. graf zkonverguje po max. N iteracích nejhorší případ: formule jsou v opačném pořadí jinak cykl. graf ohlásí chybu
Sekvenční alg. Formule jsou vyhodnovány podle daného pořadí Obdoba auto-acyclic alg. Paralelizace Možnost paralelizace dotazů podle PBY
Agenda Úvod, OLAP, Spreadsheet Rozšíření jazyka SQL pro spreadsheety Parametrizace Implementace Analýza a optimalizace dotazu Datová struktura, vyhodnocení Výkonnost
hash-join vs.sql spreadsheet Data: 4 dimenzionální kostka, přes 22M řádků
Závěr, dotazy