Dotazovací jazyky I Datová krychle Soběslav Benda
Obsah Úvod do problematiky Varianty přístupu uživatelů ke zdrojům dat OLTP vs. OLAP Datová analýza Motivace Vytvoření křížové tabulky Datová krychle Teorie Operátory CUBE a ROLLUP Použití SQL syntax SŘBD
Úvod do problematiky (1) V relačních databázích zaznamenáváme různé subjekty a vztahy mezi nimi Subjekty mají různé vlastnosti (atributy) Výrobek název, čas_výroby, kategorie Měření teploty naměřená_hodnota, čas_měření, území Subjekty mají vztahy k různým dimenzím Dimenze = typické kategorie pro analýzu obchodních dat Příklad: čas, geografická poloha, kategorie, Kolik jsem vyrobil ve kterém měsíci? Jaké byly průměrné denní teploty v různých krajích?
Úvod do problematiky (2) Na data se obvykle potřebujeme dotazovat z různých perspektiv Dvě kategorie dotazů: Dotazy pro výběr konkrétních záznamů Jaké filmy hrají dnes v kině Světozor? Jaké dvojice zákazníků mají stejnou adresu? Dotazy pro zachycení celků Kolik zákazníků žije v Praze? Kolik průměrně filmů hrála pražská kina v každém měsíci předchozího roku?
Úvod do problematiky (3) Dvě kategorie přístupů k datům: Uživatelé přistupují k datům denně OLTP (Online transakční zpracování) Řízení změn dat v tabulkách během provádění obchodních procesů Načítání určitých záznamů Modifikace existujících záznamů Uživatelé hledají smysl ohromného množství dat OLAP (Online analytické zpracování) Sumární náhledy na data Reporty Sestavy Hledání vzorů v datech, rozhodování, udržení podniku na úrovni potřebné k úspěšnému přežití na trhu
Úvod do problematiky (4) Datová analýza Formulace dotazu Získání agregovaných hodnot Vizualizace výsledků Chceme všechny závislosti najednou - sledování vývoje, rozdílů Vizualizace 2D a 3D objektů Dimenzionální redukce - agregace přes počítané kategorie (histogramy), křížové tabulky, částečné součty, Analýza výsledků a formulace nových dotazů zpřesňování/zobecňování pohledů
Úvod do problematiky (5) Histogram = jeden ze způsobů vizualizace dat Souhrny přes vypočítané kategorie Příklad: Počasí(čas, z_šířka, z_výška, teplota) Pro každé území chceme minimální měsíční teplotu. Moderní SQL systémy podporují histogramy přímo (není potřeba používat hnízděné dotazy jako v SQL92) SELECT měsíc, území, MIN(teplota) FROM Počasí GROUP BY Měsíc(čas) AS měsíc, Území(z_šířka,z_výška) AS území Mnohem zajímavějším problémem jsou např. křížové tabulky
Motivace (1) Demonstrace vytvoření křížové tabulky Mějme tabulku obsahující záznamy o počtech zvířat v prodejních pobočkách. zvirata(druh, pobocka, počet) druh pobocka pocet pes Praha 12 pes Brno 14 pes Ostrava 5 kočka Ostrava 9 kočka Praha 18 želva Brno 4 želva Ostrava 1
Motivace (2) Z uvedených dat chceme získat souhrnný report (křížovou tabulku): Otázky: Praha Brno Ostrava ALL pes 12 14 5 31 kočka 18 9 27 želva 4 1 5 ALL 30 18 15 63 Jaké nástroje můžeme v SQL systémech využít? Jak použít rychlou a efektivní cestu?
Motivace (3) Agregační funkce Vytváření základních souhrnných informací Možno aplikovat na všechny řádky vrácené klauzulemi FROM a WHERE Použití se vztahuje k hodnotám daného sloupce tabulky Agregační funkce vrací jednu hodnotu Standardní agregační funkce COUNT() - možno použít na všechny sloupce SUM() MIN() MAX() AVG() Mnoho SQL systémů přidává doménově specifické (statistické, fyzikální, finanční analýza, ) Některé systémy umožňují přidávat vlastní
Motivace (4) Výpis počtu všech zvířat: SELECT SUM(pocet) FROM zvirata Výpis počtu psů ve všech pobočkách: SELECT SUM(pocet) FROM zvirata WHERE druh='pes' Výpis počtu všech zvířat v pražské pobočce: SELECT SUM(pocet) FROM zvirata WHERE pobocka='praha'
Motivace (5) Operátor GROUP BY Umožňuje aplikovat agregační funkce na několik skupin v jednom dotazu Řádky, které projdou filtrem WHERE se konceptuálně rozdělí na skupiny, pro které je hodnota zadaného sloupce (sloupců) stejná Získáváme tabulku skupin a na jednotlivé skupiny se pak aplikuje agregační funkce (každá skupina přispívá jedním řádkem do výsledné tabulky) Syntaxe: SELECT { <sloupec> <výraz>, } FROM <odkaz na tabulku> WHERE <podmínka> GROUP BY { <odkaz na sloupec>, }
Motivace (6) Výpis všech poboček s počtem zvířat: SELECT pobocka, SUM(pocet) FROM zvirata GROUP BY pobocka Výpis všech druhů zvířat s jejich počtem ve všech pobočkách: SELECT druh, SUM(pocet) FROM zvirata GROUP BY druh
Motivace (7) Je možno získat data pro report jedním dotazem prostředky které známe? ALL(druh) = {kočka, pes, želva} Praha Brno Ostrava ALL pes 12 14 5 31 kočka 18 9 27 želva 4 1 5 ALL 30 18 15 63 druh pobočka počet ALL ALL 63 ALL Brno 18 ALL Ostrava 15 ALL Praha 30 kočka Ostrava 9 kočka Praha 18 kočka ALL 27 pes Brno 14 pes Ostrava 5 pes Praha 12 pes ALL 31 želva Brno 4 želva Ostrava 1 želva ALL 5
Motivace (8) Použití GROUP BY a UNION Hodnoty ALL budou ve výsledné tabulce reprezentované jako řetězce SELECT druh, pobocka, pocet FROM zvirata UNION SELECT druh,'all', SUM(pocet) FROM zvirata GROUP BY druh UNION SELECT 'ALL', pobocka, SUM(pocet) FROM zvirata GROUP BY pobocka UNION SELECT 'ALL','ALL', SUM(pocet) FROM zvirata
Motivace (9) Použití GROUP BY a UNION Zápis dotazu je dlouhý Pro každou požadovanou dimenzi je potřeba jeden UNION Výpočetně náročné = pro každý poddotaz se prochází data zvonu, třídění výsledků, hašové výpočty, Nejednotný přístup = ALL jsou řetězce Řešení = operátor CUBE Vytvoří tabulku, která bude mít všechny agregované hodnoty CUBE(druh, pobocka) SELECT druh, pobocka, SUM(pocet) FROM zvirata GROUP BY druh, pobocka WITH CUBE
Motivace (10) SELECT druh,pobocka,sum(pocet) FROM zvirata GROUP BY druh,pobocka WITH CUBE druh pobočka počet ALL ALL 63 ALL Brno 18 ALL Ostrava 15 ALL Praha 30 kočka Ostrava 9 MS SQL Server 2005 2x rychlejší než GROUP BY a UNION kočka Praha 18 kočka ALL 27 pes Brno 14 pes Ostrava 5 pes Praha 12 pes ALL 31 želva Brno 4 želva Ostrava 1 želva ALL 5
Datová krychle (1) N-Dimenzionální zobecnění agregací: 0-D agregační funkce 1-D GROUP BY 2-D křížová tabulka 3-D datová krychle >3-D datová hyper-krychle
Datová krychle (2) Příklad: demonstrace 3D-agregace Prodej pečiva (kusy v řádech tisíců) Tabulka: prodej_pečiva(datum, město, druh, prodáno)
Datová krychle (3) Množinový význam CUBE(A, B, C) (A) (B) (C) (A, B) (A, C) (B, C) (A, B, C) Pro CUBE na N atributech bude ve výsledné tabulce 2 N - 1 souhrnných hodnot CUBE(druh, pobočka) (druh), (pobočka), (druh, pobočka) druh pobočka počet ALL ALL 63 ALL Brno 18 ALL Ostrava 15 ALL Praha 30 kočka Ostrava 9 kočka Praha 18 kočka ALL 27 pes Brno 14 pes Ostrava 5 pes Praha 12 pes ALL 31 želva Brno 4 želva Ostrava 1 želva ALL 5
Datová krychle (4) Kardinalita výsledné kostky CUBE nad N atributy, které mají kardinalitu C 1, C 2,, C N je kardinalita výsledné kostky (horní odhad) = (C 1 +1) x x (C N + 1) Příklad: zvirata(druh, pobocka, počet) Druh = {pes, kočka, želva}, C 1 = 3 Pobočka = {Praha, Brno, Ostrava}, C 2 = 3 CARD(CUBE) = (3 + 1) x (3 + 1) = 16 Počet řádků v naší kostkce bylo 14
Datová krychle (5) Někdy nepotřebujeme všechny agregace Všechny kombinace nemusí dávat smysl Stačí produkovat hierarchii dle pořadí atributů Vybudování celé kostky je drahá operace ROLLUP(A, B, C) (A, B, C), (A, B), (A) ROLLUP(druh, pobočka) (druh, pobočka), (druh) Praha Brno Ostrava ALL pes 12 14 5 31 kočka 18 9 27 želva 4 1 5 ALL 63
Datová krychle (6) Operátory tvoří hierarchii GROUP BY, ROLLUP a CUBE mají zajímavou algebru: CUBE(ROLLUP) = CUBE CUBE(GROUP BY) = CUBE ROLLUP(GROUP BY) = ROLLUP Operátory můžeme skládat Nejsilnější varianta: GROUP BY <sloupce> ROLLUP <sloupce> CUBE <sloupce>
Datová krychle (7) Příklad kombinování operátorů prodej_pečiva(datum, město, druh, prodáno) SELECT datum, město, druh, SUM(prodáno) FROM prodej_pečiva GROUP BY datum, ROLLUP(město, druh) Agregace pro všechna města a všechna města a druhy GROUP BY nad datum
Datová krychle (8) - syntaxe GROUP BY <atributy> WITH CUBE Návrh standardu MS SQL Server 2005 GROUP BY CUBE <atributy> SQL99 Oracle IBM DB2 MS SQL Server > 2005
Datová krychle (9) - syntaxe GROUP BY <atributy> WITH ROLLUP Návrh standardu MS SQL Server 2005 GROUP BY ROLLUP <atributy> SQL99 Oracle IBM DB2 MS SQL Server > 2005
Datová krychle (10) hodnota ALL Co je to hodnota ALL? Každá hodnota ALL v podstatě reprezentuje množinu (množinu přes kterou byla spočtena agregace) Příklad: ALL(druh) = {pes, kočka, želva} ALL(pobočka) = {Praha, Brno, Ostrava} Nechceme zavádět nové klíčové slovo Podobné problémy jako s NULL
Datová krychle (11) hodnota ALL Jak se s ALL vypořádat? Nahrazení ALL symbolem NULL, tzv. seskupovací NULL Nový predikát GROUPING(sloupec), který dokáže odlišit seskupovací NULL od běžných NULL Návratové hodnoty: 1 = hodnota NULL je seskupovací 0 = jinak
Datová krychle (12) hodnota ALL SELECT CASE WHEN GROUPING(druh)=1 THEN 'xxx' ELSE druh END AS druh, CASE WHEN GROUPING(pobocka)=1 THEN 'xxx' ELSE pobocka END AS pobočka, SUM(počet) as počet, FROM zvirata GROUP BY druh,pobocka WITH CUBE druh pobočka počet xxx xxx 63 xxx Brno 18 xxx Ostrava 15 xxx Praha 30 kočka Ostrava 9 kočka Praha 18 kočka xxx 27 pes Brno 14 pes Ostrava 5 pes Praha 12 pes xxx 31 želva Brno 4 želva Ostrava 1
Datová krychle (13) Doporučení pro implementace výpočtů agregací: výpočty agregací právědet na co nejnižší systémové úrovni používat pole a hašování k organizaci agregačních sloupců v paměti Mapování dlouhých řetězců do celých čísel Agregace mohou být uloženy v N-dimenzionální polích Možno používat hybridní hašování pro velké množství dat Používání paralelního zpracování pro obrovské množství dat Data mohou být roztroušena na více discích nebo uzlech
Datová krychle (14) Druhy agregačních funkcí Distributivní: F(X) = G(F(X)) COUNT MIN MAX SUM Algebraické: F(X) = H(G(X)) AVG Směrodatná odchylka Holistické: MostFrequent
Datová krychle (15) použití Reporty Křížové tabulky, histogramy, grafy, OLAP (Online analytické zpracování) Cíle: Analyzovat obrovské množství dat Vygenerovat různé varianty souhrnů a agregací Oproti reportům interaktivní (materializované kostky) práce přímo s kostkou Celá databáze je do určité míry denormalizovaná Připuštěna určitá míra redundance Databáze označujeme jako dimenzionální Dimenze krychle = typické kategorie pro analýzu obchodních dat čas, geografická poloha, skupiny výrobků apod.
Datová krychle (16) Údržba materializovaných krychlí je jiná než jejich pouhé vytváření jako u reportů Potřeba měnit hotovou krychli dynamicky - spouště (triggers) Algebraické funkce Laciná údržba Distributivní funkce Drahá údržba Holistické funkce Velmi drahá údržba
Závěr (1) Operátory CUBE a ROLLUP Zobecnění GROUP BY (1D agregace) Optimalizované získávání agregací přes více dimenzí Vhodné používat nad velkými daty Zjednodušení zápisu dotazů Použití datových krychlí: Generátory reportů Použití CUBE a ROLLUP v SQL OLAP systémy Materializované krychle
Závěr (2) Operátor CUBE Celá kostka = agregace přes všechny dané atributy (dimenze) Operátor ROLLUP Část kostky = produkuje hierarchie dle pořadí daných atributů (dimenzí) Predikát GROUPING Umožňuje odlišit hodnoty ALL, resp. seskupovací NULL ve výsledných tabulkách
Zdroje [1] J. Gray a kol.: Data cube: A Relational Aggregation Operator Generalizing Group-By, Cross-Tab, and Sub- Totals, New Orleans, March 1996 [2] SQL1999. ansi-iso-9075-2-1999, September 1999 [3] http://www2.cs.uregina.ca/~hamilton/courses/831/notes/dcubes/dcubes.html [4] R.Vieira: SQL Server 2000 Programujeme Profesionálně, Computer Press, Brno, 2001
Děkuji za pozornost