Data Cube Luboš Kulič Tomáš Kuthan 31.10.2007
Osnova Motivace Použití DWH, analýza dat Operátory CUBE a ROLLUP teorie Podpora v reálných (SŘBD)
Motivace Většina souč. DB relační => zaznamenání vztahů Velmi často vztah nějakého subjektu k různým dimenzím př. subjektů zákazník, zaměstnanec, transakce, výrobek př. dimenzí čas, poloha (adresa...), peníze (cena/plat...)
Motivace Př. Prodej výrobků ID Výrobku Kategorie Podkategorie Prodejní ID Zákazníka Výrobku Výrobku Čas Prodeje Kanál Cena KS 35107 Jan Novák HW Síťové prvky 12.06.2007 19:05 Internet 1254 3 25667 Jiří Laušman SW OS 14.06.2007 10:15 Telefon 2666 1 34211 Eva Tichá HW Procesory 14.06.2007 12:24 Telefon 3522 2 16467 Petr Buben HW Monitory 15.06.2007 15:46 Prodejna 12629 1 21341 Jana Stará HW Pevné disky 24.06.2007 08:55 Internet 2856 2 Počet KS
Motivace Analýza dat Inf. systémy, účetnictví ( ) - potřeba pracovat s daty s přesností na každý záznam Lidé (především analytici, manažeři atp.) - spíše důležitý celkový pohled => agregovaná data
Motivace Analýza dat Př. Kolik jsem prodal od různých druhů výrobků Kolik výrobků jsem prodal v kterém městě Kolik výrobků jsem prodal v kterém měsíci
Motivace Analýza dat Velmi často chci analyzovat data o nějakém subjektu v závislosti na různých faktorech Na první pohled odpovídá reprezentaci v DB různé dimenze
Motivace Analýza dat Problém chtěl bych mít všechny závislosti najednou A nejlépe ještě možnost si v případě potřeby zpřesňovat/abstrahovat pohled (drill down/roll up) Klasické SQL nabízí pouze GROUP BY => agregace vzhledem k jedné dimenzi
Viz Excel Motivace - Příklad
Možné řešení Výsledných dat s agregáty je možné dosáhnout kombinací různých GROUP BY dotazů spojených pomocí UNION Pro každou požadovanou dimenzi je ale potřeba jeden UNION
Možné řešení SELECT Kategorie, "" as Podkategorie, "" as ID_Výrobku, sum(cena_ks * Počet_KS) as Tržby FROM Prodej_Výrobků WHERE Kategorie = HW GROUP BY Kategorie UNION ALL SELECT Kategorie, "" as Podkategorie, ID_Výrobku, sum(cena_ks * Počet_KS) as Tržby FROM Prodej_Výrobků WHERE Kategorie = HW GROUP BY Kategorie, Podkategorie UNION ALL...
Nevýhody Sjednocení mnoha dotazů používajících GROUP BY, pro každý nutný průchod daty a třídění => výpočetně velmi náročné Výsledek není běžný relační objekt řádky s mezisoučty jsou zvláštní
Datová kostka Zevšeobecnění agregačních funkcí a GROUP BY do více dimenzí
Datová kostka 0D jen agregační funkce 1D GROUP BY + agreg. fce 2D křížová tabulka (cross table) Tržby HW SW Celkový součet Internet Prodejna Telefon Celkový součet 67 362 63 272 14 222 144 856 18 040 11 776 7 998 37 814 85 402 75 048 22 220 182 670
Datová kostka 3 a více dimenzí datová kostka
Využití - DWH Datové sklady Místo, kde jsou uchovávána všechna data z podniku Typicky jako soubor dat z různých produkčních systémů ale jednotný pohled, čištění atd. Účelem mj. podpora rozhodování, řízení společnosti
Využití - DWH Pro účely analýz nad DWH se právě velmi hodí multidimenzionální pohled při rozhodování by neměla být žádná závislost zanedbaná Často potřeba interaktivity po položení dotazu výsledek vizualizován, analyzován a na základě toho položen další dotaz
Využití DWH Reporty OLAP Online Analytical Processing Oproti reportům interaktivní Přímo práce s kostkou možnost různě řezat, přecházet v rámci dimenzí nahoru/dolů, popř. skákat mezi různými dimenzemi Vytváření hypotéz a jejich ověřování, Co-kdyby (What-if) analýza atp.
Datová kostka v SQL
Příklad - schéma CREATE TABLE prodej_baget ( menza varchar2(20), datum date, bageta varchar2(20), prodano integer Menza Datum Bageta # Trója 10/30/07 cvalík 4 Trója 10/30/07 golf 2 Trója 10/31/07 cvalík 7 Trója 10/31/07 golf 1 Voršilská 10/30/07 cvalík 5 Voršilská 10/30/07 golf 6 Voršilská 10/31/07 cvalík 4 Voršilská 10/31/07 golf 0 );
Vyjádření v SQL92 SELECT to_char(datum) datum, bageta, sum(prodano) prodej FROM prodej_baget WHERE menza = 'Voršilská' GROUP BY datum, bageta UNION SELECT 'ALL', bageta,sum(prodano) FROM prodej_baget WHERE menza = 'Voršilská' GROUP BY bageta UNION SELECT to_char(datum), 'ALL',sum(prodano) FROM prodej_baget WHERE menza = 'Voršilská' GROUP BY datum UNION SELECT 'ALL', 'ALL', sum(prodano) FROM prodej_baget WHERE menza = 'Voršilská';
SQL 1999 - operátor CUBE SELECT to_char(datum), bageta, sum(prodano) FROM prodej_baget WHERE menza='voršilská' GROUP BY CUBE(datum, bageta); Den Bageta Prodano ALL ALL 15 ALL golf 6 ALL cvalík 9 10/30/07 ALL 11 10/30/07 golf 6 10/30/07 cvalík 5 10/31/07 ALL 4 10/31/07 golf 0 10/31/07 cvalík 4
Cena výpočtu Operace Cena SELECT STATEMENT 15 SORT 15 UNION-ALL HASH 4 TABLE ACCESS 2 HASH 4 TABLE ACCESS 2 HASH 4 TABLE ACCESS 2 SORT 3 TABLE ACCESS 2 Celkem 53 Operace Cena SELECT STATEMENT 3 SORT 3 GENERATE 3 SORT 3 TABLE ACCESS 2 Celkem 14 Operátor CUBE 'Obyčejné' GROUP BY
Výpočet datové kostky Menza Datum Bageta # Trója 10/30/07 cvalík 4 Trója 10/30/07 golf 2 Trója 10/31/07 cvalík 7 Trója 10/31/07 golf 1 Voršilská 10/30/07 cvalík 5 Voršilská 10/30/07 golf 6 Voršilská 10/31/07 cvalík 4 Voršilská 10/31/07 golf 0 staženo z http://xkcd.com
Datová kostka - výsledek Menza Den Bageta Počet ALL ALL ALL 29 ALL ALL golf 9 ALL ALL cvalík 20 ALL 30.10.2007 ALL 17 ALL 30.10.2007 golf 8 ALL 30.10.2007 cvalík 9 ALL 31.10.2007 ALL 12 ALL 31.10.2007 golf 1 ALL 31.10.2007 cvalík 11 Trója ALL ALL 14 Trója ALL golf 3 Trója ALL cvalík 11 Trója 30.10.2007 ALL 6 Trója 30.10.2007 golf 2 Trója 30.10.2007 cvalík 4 Trója 10/31/07 ALL 8 Trója 10/31/07 golf 1 Trója 10/31/07 cvalík 7 Voršilská ALL ALL 15 Voršilská ALL golf 6 Voršilská ALL cvalík 9 Voršilská 10/30/07 ALL 11 Voršilská 10/30/07 golf 6 Voršilská 10/30/07 cvalík 5 Voršilská 10/31/07 ALL 4 Voršilská 10/31/07 golf 0 Voršilská 10/31/07 cvalík 4
Velikost datové kostky Kostka na N atributech přibylo 2 N - 1 souhrnných hodnot Velikost kostky jsou-li kardinality atributů C 1, C 2,... C N pak horní odhad velikosti je Π(C i + 1)
Hodnota ALL Nové klíčové slovo SQL? podobné chování a problémy jako NULL Řešení - nahrazení ALL symbolem NULL tz. seskupovací NULL (GROUPING NULL) Jak odlišit od běžného NULL? nový predikát GROUPING() GROUPING(<název_sloupce>) vrací 1, pokud hodnota NULL ve sloupci je seskupovací jinak vrací 0
GROUPING -- přidáme řádek s nevyplněným datem INSERT INTO prodej_baget VALUES ('Voršilská',NULL,'cvalík',1); -- použijeme GROUPING pro jeho identifikaci SELECT to_char(datum) datum, sum(prodano), grouping(datum) gd FROM prodej_baget WHERE menza='voršilská' AND bageta='cvalík' GROUP BY CUBE(datum); Datum Prodej GD NULL 1 0 NULL 10 1 30.10.2007 5 0 31.10.2007 4 0 Poznámka: formálně jde o převod mezi n-ticemi ( ALL, f() ) ( NULL, f(), 1 )
GROUPING_ID není součást standardu, menší podpora kompaktnější vyjádření než GROUPING pomocí bitové mapy Př: Menza Datum Bageta Prodej GID NULL NULL cvalík 1 4 NULL NULL cvalík 21 6
Histogram Souhrny přes vypočítané kategorie ve standardu SQL92 nebylo možné řešilo se pomocí hnízděného poddotazu SELECT year(datum), month(datum), dayofweek(datum), sum(prodano) FROM prodej_baget GROUP BY ROLLUP(year(datum), month(datum), dayofweek(datum)) Rok Měsíc Den Prodej 2007listopad úterý 17 2007listopad středa 12 2007listopad ALL 29 2007ALL ALL 29 ALL ALL ALL 30
ROLLUP někdy nepotřebujeme souhrny přes všechny kombinace atributů vybudování celé kostky je nákladné ne všechny kombinace musí dávat smysl Operátor ROLLUP produkuje hierarchii podle pořadí atributů méně hodnot
ROLLUP - Příklad SELECT menza, to_char(datum), bageta, sum(prodano) FROM prodej_baget GROUP BY ROLLUP(menza, datum, bageta); Menza Datum Bageta Počet Trója 30.10.2007 golf 2 Trója 30.10.2007 cvalík 4 Trója 30.10.2007 ALL 6 Trója 31.10.2007 golf 1 Trója 31.10.2007 cvalík 7 Trója 31.10.2007 ALL 8 Trója ALL ALL 14 Voršilská 30.10.2007 golf 6 Voršilská 30.10.2007 cvalík 5 Voršilská 30.10.2007 ALL 11 Voršilská 31.10.2007 golf 0 Voršilská 31.10.2007 cvalík 4 Voršilská 31.10.2007 ALL 4 Voršilská ALL ALL 15 ALL ALL ALL 29
GROUPING SETS Další alternativa ke CUBE a ROLLUP novější rozšíření SELECT menza, to_char(datum),bageta, sum(prodano) FROM prodej_baget GROUP BY GROPING SETS(menza, (bageta,datum)); Menza Datum Bageta Prodano ALL 30.10.2007 cvalík 9 ALL 31.10.2007 golf 1 ALL 30.10.2007 golf 8 ALL 31.10.2007 cvalík 11 Trója ALL ALL 14 Voršilská ALL ALL 15
Množinový význam CUBE(A,B,C) (A,B,C), (A,B), (A,C), (B,C), (A), (B), (C), () ROLLUP(A,B,C) (A,B,C), (A,B), (A), () GROUPING SETS((A,C),(B,C),B) (A,C), (B,C), (B)
Syntax GROUP BY CUBE<aggregation list> Standard SQL1999 [3] Oracle, DB2, MS SQL Server ASA - Adaptive Server Anywhere GROUP BY <aggregation list> WITH CUBE návrh standardu [1] T-SQL ASA
Kombinování operátorů Operátory tvoří hierarchii GROUP BY ROLLUP CUBE Můžeme je za sebe skládat v pořadí GROUP BY <select list> ROLLUP <select list> CUBE <select list>
Kombinování operátorů - příklad SELECT datum, menza, bageta, sum(prodano) FROM prodej_baget GROUP BY datum, ROLLUP(menza, bageta) Datum Menza Bageta Prodano 30.10.2007 Trója golf 2 30.10.2007 Trója cvalík 4 30.10.2007 Trója ALL 6 30.10.2007 Voršilská golf 6 30.10.2007 Voršilská cvalík 5 30.10.2007 Voršilská ALL 11 30.10.2007 ALL ALL 17 31.10.2007 Trója golf 1 31.10.2007 Trója cvalík 7 31.10.2007 Trója ALL 8 31.10.2007 Voršilská golf 0 31.10.2007 Voršilská cvalík 4 31.10.2007 Voršilská ALL 4 31.10.2007 ALL ALL 12
Podpora v SŘBD Podporují specifikaci T431 Oracle DB2 MS SQL Server, ASA Prozatím nepodporují MySQL, PgSQL, Derby
Závěr Operátor CUBE rozšiřuje SQL konstrukci GROUP BY zefektivňuje vícedimenzionální dotazování umožňuje počítat souhrny nad vypočtenými kategoriemi Někdy je dobré zvážit použití úspornější verze ROLLUP
Zatajeno Definování uživatelských agregačních funkcí Infromix Illustra Implementace operátorů dělení agregačních funkcí distributivní, algebraické, holistické Materializace datové kostky a její údržba
Literatura [1] J. Gray, A. Bosworth, A. Layman, and H. Pirahesh. Data cube: A relational aggregation operator generalizing group-by, cross-tab, and sub-totals. In Proc. 12th ICDE, pages 152--159, New Orleans, March 1996 [2] A. Beaulieu, S. Mishra. Mastering Oracle SQL, 2nd Edition, O'Reilly, June 2004 [3] SQL1999. ansi-iso-9075-2-1999, September 1999 [4] Chris Eaton. blog, http://blogs.ittoolbox.com/database/technology/archives/, as visited 29.10.2007 [5] Markus Jaegle. Grouping_id. Technical Background Info, April 2002 [6] http://wiki.apache.org/db-derby/ as visited on 29.10.2007... a dokumentace jednotlivých SŘBD