Kukhar Maria Dotazovací jazyky I MFF UK 2012
1. Rozšíření SQL pro spreadsheety 2. Motivační příklad použití spreadsheetu 3. Analýza a optimalizace spreadsheetu 4. Zpracování SQL Spreadsheet 5. Experimentální výsledky
Faktová tabulka f(t,r,p,s,c Dimenze: t čas, r region, p produkt Metriky: s prodej, c ceny
PARTITION (PBY Rozdělení dat do disjunktních podmnožin DIMENSION (DBY Identifikují jedinečný řádek v každé časti (partition - buňka Popisky dat MEASURES (MEA Počítané výrazy Struktura Spreadsheet klauzule: <existing parts of a query block> SPREADSHEET PBY (cols DBY (cols MEA (cols <processing options> ( <formula>, <formula>,.., <formula> Odkazování na jednu buňku s[p= dvd, t=2002] Odkazování na řadu buněk s[p= dvd, t<2002]
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] Funkce cv( - přenáší hodnotu dimenze z levé strany na pravou Operátor * - označuje všechny hodnoty v dimenze SPREADSHEET DBY (r, p, t MEA (s ( s[ west,*,t>2001]= 1.2*s[cv(r,cv(p,t=cv(t-1]
Existenční formule SPREADSHEET PBY(r DBY (p, t MEA (s ( s[ vcr,t<2002]=avg(s[ vcr,cv(t-2<=t<cv(t] Výsledek existenční formule může být závislý na pořadí. Zadání pořadí pro zpracovaní SPREADSHEET PBY(r DBY (p, t MEA (s ( s[ vcr, t<2002] ORDER BY t ASC =avg(s[cv(p,cv(t-2<=t<cv(t]
Vytváření nových řádků UPSERT - vytvoří buňku pokud neexistuje, jinak update UPDATE - ignoruje neexistující buňky SPREADSHEET PBY(r DBY (p, t MEA (s ( UPSERT s[ tv, 2000] =s[ black-tv,2000] + s[ white-tv,2000] UPSERT nezpracovává existenční vzorce.
Objekty s různou dimenzionalitou: Prodej : region(r, product(p, sales(s a time(t Budget :region(r, product(p Referenční spreadsheety jako doplnění základního spreadsheetu Přístup jen pro čtení k jiným tabulkám během počítání Příklad: 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]
AUTOMATIC ORDER - Implicitně se formule vyhodnocují podle závislostí SPREADSHEET PBY(r DBY (p, t MEA (s ( s[ dvd,2002] = s[ dvd,2000] + s[ dvd,2001] s[ dvd,2001] = 1000 SEQUENTIAL ORDER SPREADSHEET DBY(r,p,t MEA(s SEQUENTIAL ORDER (...<formulas>...
Formule jsou na sobě cyklicky závislé s[1] = s[1]/2 SEQUENTIAL ORDER SPREADSHEET DBY(r,p,t MEA(s SEQUENTIAL ORDER (...<formulas>... Opce pro zpracování ITERATE (n - požaduje opakování folmule n-krat. UNTIL condition - zastaví iteraci, pokud <condition> bude splněna před tím, než se stane maximálně n iterací stanovených ITERATE(n. SPREADSHEET DBY (x MEA (s ITERATE (10 UNTIL (PREVIOUS(s[1]-s[1] <= 1 ( s[1] = s[1]/2
Další instrukce Nastavení UPDATE/UPSERT mode jako defaullt (automaticky IGNORE NAV považuje NULL za 0 pro aritmetické operace Predikát <cell> IS PRESENT indikuje je-li řádek, identifikovaný buňkou <cell>, existoval před zpracováním spreadsheet klauzule. Vhodné pro zjištění hodnot UPSERT
2. Motivační příklad použití spreadsheetu (1 Příklad 1. SELECT r, p, t, s FROM f SPREADSHEET PBY(r DBY (p, t MEA (s ( F1: UPDATE s[ tv,2002] =slope(s,t[ tv,1992<=t<=2001]*s[ tv,2001] + s[ tv,2001] F2: UPDATE s[ vcr, 2002] =s[ vcr, 2000] + s[ vcr, 2001], F3: UPDATE s[ dvd,2002] =(s[ dvd,1999]+s[ dvd,2000]+s[ dvd,2001]/3, F4: UPSERT s[ video, 2002] =s[ tv,2002] + s[ vcr,2002]
2. Motivační příklad použití spreadsheetu (2 ANSI SQL Slope( funkce prochází data pro nalezení řádků vyhovujících predikátu 1992 <= t <= 2001 F1: agregační poddotaz, spojení do faktové tabulky f F2: dvojité spojení faktové tabulky sama se sebou F3: trojité spojení faktové tabulky sama se sebou F4: operaci UNION Složité generovat a neefektivní pro vykonání
2. Motivační příklad použití spreadsheetu (3 SQL spreadsheet Pokud se nám podaří vyvodit, že se jedná o Integer, F1 se transformuje na F1: UPDATE s[ tv,2002] = slope(s,t[ tv,t in (1992,.,2001]*s[ tv,2001]+ s[ tv,2001] To umožňuje použít náhodný přístup a nemusejí se data procházet a zjišťovat zda vyhovují predikátu. F2, F3, F4 využívají strukturu přímo. Struktura je pak použita vícekrát a to zvýší produktivitu více než hodně spojení, které potřebuje ANSI SQL.
2. Motivační příklad použití spreadsheetu (4 Příklad 2. Spreadsheet SELECT r, p, t, s FROM f SPREADSHEET PBY(r, p DBY (t MEA (s, 0 as x1 ( UPSERT x[for t IN (SELECT t FROM time_dt]= 0 ANSI SQL SELECT f.r, f.p, f.t, f.s FROM f RIGHT OUTER JOIN ( (SELECT DISTINCT r, p FROM f CROSS JOIN (SELECT t FROM time_dt v ON (f.r = v.r and f.p = v.p and f.t = v.t Obsahuje kartézský součin f a time_td a spojuje to s f. To mnohem méně efektivní nežli v spreadsheet
Orientovaný graf, vrcholy jsou formule, hrany jsou závislosti formulí Formule F1 závisí na F2 (F2 -> F1 právě tehdy když R(F1 má neprázdný průnik s L(F2 F1:s[ video,2000]=s[ tv, 2000]+s[ vcr, 2000] F2:s[ vcr, 2000]=s[ vcr,1998]+s[ vcr, 1999] R(F - buňky referencované na pravé straně L(F- buňky modifikované na levé straně. Když odkazujeme na buňky jako s[ tv, t2+t3+t4< t5] - předpokládáme, že se formule odkazuje na všechny buňky Výsledkem vztahu -> je graf s formulemi jako vrcholy a závislostí jako hrany. Pro acyklický graf lze dosáhnout minimální počet scanů pomocí minimalizace čísla úrovní.
Formule které nepotřebujeme můžem odstranit. To je takové formule u kterých 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 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] v WHERE p in ( dvd, vcr, video ; Algoritmus identifikuje formule takové, z kterých nevedou hrany
Pro odstranění zbytečných vypočtu nevždy stačí Prořezání formulí 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, v Nemůžem vyloučit F1, ale nepotřebujem pro spočítání s hodnoty všech produktu. Proto přepíšem levou stranu formule F1 : s[p in ( dvd, vcr,2002]= c[cv(p, 2002]*2
Posun PBY predikátů mezi vnitřním a vnějším blokem vždy správný 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]+s[ dvd,1997], F2:s[ vcr,2000]=s[ vcr,1998]+s[ vcr,1999] v WHERE r = east and t = 2000 and p = dvd Posun muže být mezi nezávislými dimenzemi Při absenci pravidel UPSERT nezávislé dimenze můžou se přemístit z DBY do PBY. SPREADSHEET PBY(r, p DBY (t MEA (s UPDATE
Vnější DBY predikáty, které není nezávislý lze také posouvat predikát který definuje ohraničující obdélník referenčních buněk Pro F2 je to p= vcr a t v (1998, 1999 Pro F1 je to p= dvd a t v (1997, 1999 Ohraničující obdélník pro celý spreadsheet p in ( vcr, dvd a t v (1997, 1998, 1999 Máme vnější predikát t = 2000 s t v(1997, 1998, 1999 => posun t v (1997, 1998, 1999, 2000. Obtížný scénář - ohraničující obdélník nemůže být určen pro formule v dobu optimalizace
S1 SELECT p, m, s, r_yago, r_qago FROM (SELECT p, m, s FROM f GROUP BY p, m SPREADSHEET REFERENCE prior ON (SELECT m, m_yago, m_qago FROM time_dt DBY(m MEA(m_yago, m_qago PBY(p DBY (m MEA (sum(s s,r_yago,r_qago ( F1: r_yago[*] = s[cv(m] / s[m_yago[cv(m]], F2: r_qago[*] = s[cv(m] / s[m_qago[cv(m]] v WHERE p = dvd and m IN (1999-01, 1999-03;
Ref-subquery pushing S2 WITH ref_subquery AS (SELECT m, m_yago, m_qago FROM time_dt WHERE m IN (1999-01, 1999-03 SELECT m AS m_value FROM ref_subquery UNION SELECT m_yago AS m_value FROM ref_subquery UNION SELECT m_qago AS m_value FROM ref_subquery Posun do vnitřního bloku dotazu: SELECT p, m, s, r_yago, r_qago FROM (SELECT p, m, s FROM f WHERE m IN (SELECT m_value FROM S2 GROUP BY p, m SPREADSHEET <.. as above in query S1.. > WHERE p = dvd and m IN (1999-01, 1999-03;
Extended pushing SELECT DISTINCT m_yago, m_qago FROM time_dt WHERE m IN (1999-01, 1999-03 Aby získat hodnoty pro m_yago a m_qago odpovídající m IN (1999-01, 1999-03. Předpokládejme, že odpovídající pro m_yago je (1998-1901, 1998-1903 a pro m_qago je (1998-1910, 1998-1912. Nakonec jsme posunem tento predikát do vnitřního dotazu: SELECT p, m, s, r_yago, r_qago FROM (SELECT p, m, s FROM f WHERE m IN (1999-01, 1999-03, /* outer preds */ 1998-01, 1998-03, /* prev year */ 1998-10, 1998-12 /* prev quart */ GROUP BY p, m SPREADSHEET <.. as above in query S1.. > WHERE p = dvd and m IN (1999-01, 1999-03;
Formula unfolding Pro m = 1999-01, hodnota m_yago = 1998-01 и m_qago =1998-10 Pro m = 1999-03, hodnota m_yago = 1998-03, a m_qago= 1998-12. Tyto formule rozvinují jako SELECT p, m, s, r_yago, r_qago FROM (SELECT p, m, s FROM f GROUP BY p, m SPREADSHEET REFERENCE prior ON (SELECT m, m_yago, m_qago FROM time_dt DBY(m MEA(m_yago, m_qago PBY(p DBY (m MEA (sum(s s,r_yago,r_qago ( F1: r_yago[1999-01] = s[1999-01] / s[1998-01], F1 : r_yago[1999-03] = s[1999-03] / s[1998-03], F2: r_qago[1999-01] = s[1999-01] / s[1998-10], F2 : r_qago[1999-03] = s[1999-01] / s[1998-12] v WHERE p = dvd and m IN (1999-01, 1999-03;
dvouúrovňová hašovací struktura přístupu 1. úroveň hash rozčlenění na základě PBY sloupců 2. úroveň hash tabulka na základě PBY&DBY sloupců Hash struktura podporuje operace, jako je probe, update, upsert, inser a skenování všech záznamů v rozčlenění spreadsheetu. Číslo rozčlenění první úrovně závisí na očekávané velikosti dat dostupné paměti Velké rozčlenění spreadsheetu disk-based hash tabulka ukazatel swizzling
2 způsoby zpracovaní: Auto-Acyclic (kompletní a přesný graf závislosti, který neobsahuje žádné cykly Auto-Cyclic (pro formule s cykly nebo s komplexní predikáty.
Auto-Acyclic( { for each partition P in the spreadsheet { for level Li from L1 to Ln { /* LSi = set of formulas in Li with * single cell refs on left side * LEi = set of formulas in Li with exist- * ential conditions on left side * * First, evaluate all aggregates in set * LSi, then all formulas in that set */ for each record r in P - (I for each aggregate A in LSi apply r to A; for each formula F in LSi evaluate F; /* Evaluate all formulas in LEi */ for each record r in P - (II { find all formulas EF in LEi to be evaluated for r for each record r in P - (III for each aggregate A in EF apply r to A; for each formula EF evaluate EF; } } } }
Auto-Cyclic Pro formule s cykly nebo s komplexní predikáty. najde soubory formule, obsahující silně souvislý komponenty (SCC a uloží formule v SCC do postupných úrovni NeSSC formule vyhodnoť jako acyklické. formule v SSC vyhodnoť max. N-krát N- počet buněk (upserted or updated v 1. iteraci. při konvergenci se zastaví Acykl. graf zkonverguje po max. N iteracích Pokud se Spreadsheet nekonverguje v N bude ohlášena chyba.
Formule jsou vyhodnocovány podle daného pořadí v spreadsheet klauzule. Algoritmus je podobný Auto-Acyklickému
Data jsou distribuována na Processing Elements (PE, které založeny na PBY, každá PE může fungovat na rozčleněních nezávisle na jíní PE V některých případech rozčlenění dat pouze na PBY omezuje stupeň paralelizace a tím i škálovatelnost. S3 SPREADSHEET PBY(r DBY(p, t MEA(s UPDATE ( F1: s[*,2002]= avg(s[cv(p, t in (1998,2000], F2: s[*,2003]= avg(s[cv(p, t in (1999,2001] změnim na SPREADSHEET PBY(r, p DBY(t MEA(s UPDATE ( s[2002] = avg(s[t in (1998, 2000], s[2003] = avg(s[t in (1999, 2001]
Vyšší úroveň detailizace rozčlenění umožňuje zároveň paralelizace na r a p. S4 SPREADSHEET PBY(r DBY(p, t MEA(s UPDATE ( s[p!= bike,2002]= avg(s[cv(p,t<2001] Přepsána jako SPREADSHEET PBY(r, p DBY(p, t MEA(s UPDATE ( s[p!= bike,2002]= avg(s[cv(p,t<2001]
Experimenty byly provedeny na měřítkě APB naplněném 0,1 hustotou dat. APB schéma má faktové tabulky s 4 hierarchické dimenzí: channel - 2 úrovní time - 3 úrovní customer - 3 úrovní product - 7 úrovní Nad faktovou tabulkou byla vybudovaná kostka a uchována v tabulce apb_cube Kostka má 4 dimenzí: t(ime,p(roduct, c(ustomer, h(channel Každá reprezentovaná jednim sloupcem se všemi hierarchickými úrovněmi zakódovanými do jedné hodnoty
S5 SELECT s, share_1, share_2, share_3, p, c, h, t, FROM apb_cube SPREADSHEET REFERENCE ON (SELECT p, parent1, parent2, parent3 FROM product_dt DBY (p MEA (parent1, parent2, parent3 PBY (c,h,t DBY (p MEA (s, 0 share_1, 0 share_2, 0 share_3 RULES UPDATE ( F1: share_1[*] = s[cv(p] / s[parent1[cv(p]] F2: share_2[*] = s[cv(p] / s[parent2[cv(p]] F3: share_3[*] = s[cv(p] / s[parent3[cv(p]] algoritmy: subquery, extended-pushing and formula-unfolding
SELECT s, a1.s/a2.s AS share_1, a1.s/a3.s AS share_2, a1.s/a4.s AS share_3, p, c, h, t, FROM apb_cube a1, apb_cube a1, apb_cube a3, apb_cube a4, product_dt p WHERE a1.p=p.p & a2.p=p.parent1 & a2.c=a1.c & a2.h=a1.h & a3.t=a1.t a3.p=p.parent2 & a3.c=a1.c & a3.h=a1.h & a3.t=a1.t a4.p=p.parent3 & a4.c=a1.c & a4.h=a1.h & a4.t=a1.t
Andrew Witkowski, Srikanth Bellamkonda, Tolga Bozkaya, Gregory Dorman, Nathan Folkert, Abhinav Gupta, Shen Sankar Subramanian: Spreadsheets in RDBMS for OLAP, 2003 Andrew Witkowski, Srikanth Bellamkonda, Tolga Bozkaya, Nathan Folkert, Abhinav Gupta, Lei Sheng,Sankar Subramanian: Business Modeling Using SQL Spreadsheets