Distanční opora předmětu: Databázové systémy Tématický blok č. 3: OLAP, operátory CUBE a ROLLUP Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 OLTP a OLAP 1.1 Datový sklad 1.2 Datová kostka 2 OLAP dotazy pomocí SQL 2.1 operátor CUBE 2.2 operátor ROLLUP Studijní cíle Umět vysvětlit OLTP a OLAP rozdíly mezi nimi. Umět navrhnout strukturu datové kostky v relační databázi. Umět v SQL používat klauzuli HAVING a operátory CUBE a ROLLUP pro konstrukci OLAP dotazů. Znát a umět vysvětlit rozdíly mezi těmito konstrukcemi.
Čas potřebný ke studiu 2 - 6 hodiny na prostudování výukových textů + zodpovězení otázek k rekapitulaci 1 - 4 hodiny na vypracování modelových úloh na PC a úlohy POT 2 1 - 2 hodiny na praktické zopakování učiva na PC ( v jiný den) 30 min - 1 hodina na (znovu)zodpovězení otázek k rekapitulaci (v jiný den) Časy jsou hodně individuální a jsou závislé na míře znalostí z oblasti databázových systémů získaných během bakalářského studia. Úvod V tomto bloku probereme následující témata. Seznámí se s problematikou OLTP a OLAP systémů, zaměříme s si jejich odlišnosti. Vysvětlíme si, jaká data jsou uložena v datovém skladu a jak se s nimi pracuje. Seznámíme se s problematikou návrhu datové kostky, s rozdíly mezi datovými modely vločka a hvězda. Vysvětlíme si, jak lze použít SQL pro tvorbu OLAP dotazů. Nejprve si předvedeme jednoduchý příkaz SELECT s klauzulí GROUP BY. Následně se seznámíme s operátory CUBE a ROLLUP.
Výkladová část Vysvětlivky Červený text – Porušením nebo opomenutím takto označených pravidel vznikají těžko odladitelné chyby (zejména pro začínající programátory). Modrý text – Doporučení jak programovat v praxi. Často prevence závažných chyb. 1 OLTP a OLAP OLTP (Online Transaction Processing) systémy slouží pro uchovávání běžných provozních informací, jsou optimalizovány pro současný přístup velkého množství uživatelů, běžných zaměstnanců firmy. Po OLTP systémech se požaduje se vysoký výkon a okamžitá dostupnost informací. OLTP systémy bývají v dnešní době implementovány pomocí relačních databázových systémů, mezi které patří například SQL Server. Příkladem OLTP systému může být nám dobře známá databáze Northwind. Transakce v OLTP systémech jsou obvykle jednoduché a krátké, nejčastěji spočívají v přidávání nových řádků tabulek, méně často provádějí modifikaci existujících řádek tabulek. V OLTP systémech se může provádět i čtení dat, vyhledávání informací o konkrétních proběhlých transakcích, vyhledáváním podle hodnot některých sloupců v jedné tabulce či ve spojení několika málo tabulek. Informace uchovávané v OLTP systémech jsou velmi detailní (například: zákazník X koupil dne Y zboží Z v obchodě W). Data bývají obvykle normalizovaná ve 3 NF. Rychlost přírůstku dat je vysoká, jejich velké množství zpomaluje práci se systémem a snižuje okamžitou dostupnost dat. Z těchto důvodů se obvykle starší transakční data (například starší než 1 rok nebo 5 let) maží z aktuálních tabulek. Mazané informace z OLTP jsou navíc uchovány v datovém skladu. OLAP (Online Analytical Processing) systémy se snaží uspořádat velké objemy historických dat tak, aby data byla přístupná a srozumitelná vybrané skupině uživatelů (analytici, manažeři), zabývajících se složitější analýzou dat za účelem vyhodnocení obchodních výsledků a vyhledávání trendů. Uživatelé neprovádějí aktualizaci dat, pouze je čtou. Dotazy pokládané OLAP systémům bývají často velmi komplikované, k jejich vyhodnocení je potřeba spojení velkého množství tabulek. Klasickým příklad dotazu je zobrazení prodeje zboží podle sledovaných dimenzí (například čas, místo, výrobek, zákazník). OLAP uživatele zajímají data v agregované podobě (například dne Y se v obchodě W prodalo Q kusů zboží Z), nezajímají je jednotlivé konkrétní transakce. Data není nutno držet ve 3NF, naopak nenormalizovaná data umožňují snadnější tvorbu dotazů, protože pro dotazy postačí spojení menšího počtu tabulek. OLAP systémy mohou být implementovány pomocí relačních databázových systému (ROLAP), nebo multidimenzionálních technologií (MOLAP), nebo jejich kombinací, hybridním přístupem (HOLAP).
Při ROLAP způsobu uložení dat vytvoříme v relační databázi nové tabulky, které budou obsahovat agregovaná data. Tento způsob uložení dat se hodí pro velmi rozsáhlá data, která nejsou příliš často analyzována. Při MOLAP způsobu uložení dat využíváme technologii, která je přímo optimalizována pro multidimenzionální dotazy. Data jsou ukládána na OLAP serveru. Optimalizace spočívá v předpočítávání výsledků možných dotazů a jejich ukládání na disk, což pro rozsáhlá data může být neúnosné. MOLAP je výhodný pro menší až střední objemy dat, která často analyzujeme. Tento způsob uložení dat je využit například v rozšíření databázového systému Oracle pro OLAP. HOLAP je kompromisní řešení, využívající výhod obou přístupů. Původní data jsou ponechává v relační databází, ale agregované hodnoty jsou ukládány pomocí multidimenzionální technologie. 1.1 Datový sklad Datový sklad, někdy bývá označován zkratkami DW a DWH (Data Warehouse), slouží k uchovávání historických dat. Datový sklad je většinu času v pracovním režimu, ve kterém se data nemění a dochází pouze k jejich čtení pro potřeby OLAP. Periodicky jednou za stanovený časový úsek (například den, měsíc či rok) přibude nová dávka dat z OLTP a dochází k aktualizaci datového skladu, dochází k zápisu dat Během aktualizace je odepřen čtecí přístup OLAP uživatelům. Datový sklad obecně může získávat data z více zdrojů, které nemusí být pouze relačními databázemi. Data mohou být v jednotlivých zdrojích uloženy v různých formátech, mohou obsahovat chyby, duplicity. Samotná čištění dat je rozsáhlé vědní odvětví využívající pro svoji práci velké množství heuristik. Data bývají integrována podle vzájemných vazeb, bez ohledu na zdroj, ze kterého pocházejí. Data jsou organizována tak, aby šlo co nejsnadněji vytvářet OLAP dotazy. V běžném OLTP systému se při návrhu indexu musíme zajímat o poměr využití tohoto indexu při dotazech vzhledem k počtu aktualizačních operací, při kterých se index mění. Pokud je index využívám při dotazech málo, jeho existence může dokonce zhoršit plynulost práce s databází. V datovém skladu se data téměř nemění (pouze občasně hromadně přibývají), proto nedochází ani k častým změnám indexů. Naopak typickou prácí V OLAP systémech je dotazování, proto se v datovém skladu indexují všechny sloupce, jejichž hodnoty bychom v dotazech mohli použít v podmínce. Pokud aktualizace datového skladu je rozsáhlá (přibývá třeba desetina nových dat), může být výhodné indexy dočasně odstranit. Na začátku aktualizace datového skladu se všechny indexy zruší (příkazem DROP INDEX) a jako poslední krok aktualizace se opět vytvoří. 1.2 Datová kostka Datové sklady a OLAP využívají multidimenzionální datový model, který zobrazuje data ve formě datové kostky. Datovou kostku si lze představit jako n-dimenzionální tabulku, ve kterém jednotlivé dimenze kostky reprezentují vlastnosti dat. Na slajdu č. A/21 jsou zobrazeny 1, 2 a 3 dimenzionální datové kostky. V praxi se používají i vyšší dimenze (10-20), ale jejich grafické znázornění je obtížné. Další příklad trojdimenzionální datové kostky
vidíme na slajdu č. B/15. V tomto příkladě je na ose x klient, na ose y čas nákupu, a na ose z produkt. Jednotlivé prvky tabulky (na obrázku ty malé krychličky), reprezentují nějakou agregovanou hodnotu (například počet prodaných kusů, tržby, náklady) pro kombinaci příslušných dimenzí (například: dne Y se v obchodě W prodalo Q kusů zboží Z). Jednotlivé dimenze můžou být navíc uspořádány do hierarchií. V případě času se může jednat o přesné datum, dvojice měsíc a rok, nebo samotný rok. Hodnoty v dimenzi hierarchicky nadřazené se získají sečtením hodnot v příslušném úseku podřízené dimenze. Například prodeje v daném roce se získají sečtením prodejů v měsících daného roku. Datový model se skládá ze dvou typů tabulek: faktů a dimenzí (obrázek na slajdu č. B/21). Jedna tabulka faktů a k ní příslušné tabulky dimenzí odpovídají schématu OLAP. V tabulce faktů jsou sloupci cizí klíče jednotlivých dimenzí a sloupec s agregovanou hodnotou (například počet prodejů). Tabulky faktů jsou ve 3 NF. Tabulky dimenzí obsahují sloupce specifikující vlastností souřadnic pro danou dimenze. Rozlišujeme dva typy datových modelů: hvězda a vločka. V datovém modelu vločka (obrázek na slajdu č. B/22) jsou tabulky dimenzí ve 3NF, pro jednu dimenzi může existovat více tabulek. Při použití tohoto schématu zkomplikujeme vytvoření a vyhodnocení dotazů, protože bude docházek k častému spojován tabulek v rámci jednotlivých dimenzí. V datovém modelu hvězda (obrázek na slajdu č. B/21) tabulky nejsou ve 3 NF, pro každou dimenzi je jen jedna tabulka. Vytváření dotazů je pohodlnější a jejich vyhodnocování rychlejší než v případě schématu vločka. Nenormalizované tabulky dimenzí obsahují redundantní data, mohl by nastat problém při jejich aktualizaci, mohou zabírat také více místa na disku. Vzhledem k poměru velikosti tabulek dimenzí ku velikosti tabulky faktů, jsou tyto problémy zanedbatelné. 2 OLAP dotazy pomocí SQL SQL příkaz SELECT s využitím klauzule GROUP BY umožňuje zodpovědět celou řadu dotazů, které by mohly zajímat OLAP uživatele. Na jakém principu klauzule GROUP BY pracuje jsme si vysvětlili v tématickém bloku č. 1, kapitole 3.4. Na slajdu č. A/5 vidíme několik dotazů, které by šly vyřešit příkazem SELECT s použitím klauzule GROUP BY. Na slajdu č. A/12 vidíme tabulku, kterou budeme používat v následujícím motivačním příkladu. V tabulce (jménem Auta) máme sloupce typ automobilu, rok výroby, barva a počet prodaných kusů. Tato tabulka je již agregována, aby šla přehledně zobrazit. Můžeme si však představit původní tabulku, kde budou zaznamenány prodeje konkrétních automobilů s dodatečnými sloupci (například zákazník, datum prodeje). Každý řádek naší tabulky by se v původní tabulce opakoval (s různými hodnotami dodatečných sloupců) tolikrát, kolik je hodnota atributu počet prodaných kusů v naší tabulce. Na slajdu č. A/13 vidíme SQL dotaz (s klauzulí HAVING) zjišťující počty prodaných aut typu Octavia pro konkrétní kombinace roku výroby a barvy auta. Napravo na slajdu vidíme výsledek dotazu, obsahující 6 řádků. Problém tohoto dotazu je jeho přílišná jednoúčelovost (jedná se o jednodimenzionální řez datové kostky). Pokud by nás zajímaly počty prodaných Octavíí v roce 2000, bez rozlišení barvy auta, museli bychom dotaz přepsat, nebo ručně sečíst hodnoty prodejů z roku 2000 pro všechny barvy (bílá, stříbrná).
Na slajdu č. A/16 vidíme jak lze pomocí sjednocení (UNION) výsledků několika jednoduchých dotazů vytvořit kompletní datovou kostku. V případě tří dimenzí, musíme provést sjednocení osmi (= 23) jednoduchých dotazů. V dotazu jsme zavedly řetězec 'ALL' jako označení, že hodnoty v daném sloupci jsou agregovány. Výsledek dotazu obsahující 24 řádků je zobrazen na slajdu č. A/17. Vytváření datové kostky pomocí sjednocování jednoduchých SQL dotazů je značně nepohodlné pro programátora a jeho zpracování databázovým systémem je neefektivní. Pro vytvoření datové kostky o N dimenzích je potřeba sjednotit 2N jednoduchých dotazů obsahujících klauzuli GROUP BY. Zpracování takovéhoto dotazu je výpočetně náročné, velké množství dat se počítá zbytečně opakovaně v různých jednoduchých dotazech. Jako provizorní řešení pro malé tabulky a malý počet dimenzí je to však použitelné. Lepším řešením je použití operátoru CUBE. 2.1 operátor CUBE Operátor CUBE doplňuje klauzuli GROUP BY v příkazu SELECT tak, že při jeho použití je místo jednodimenzionálního řezu vytvořena celá datová kostka. Sloupce uvedené v klauzuli GROUP BY odpovídají dimenzím. V klauzuli SELECT jsou tyto sloupce zopakovány a bývá zde alespoň jeden další sloupec, který je tvořen hodnotou agregační funkce (například počet prodaných výrobků). Přesná syntax operátoru CUBE záleží na konkrétním databázovém systému. Na slajdu č. A/24 nahoře vidíme syntax používanou v SQL Serveru 2005, za seznam sloupců v klauzuli GROUP BY se přidají klíčová slova WITH CUBE. Na slajdu dole je uvedena syntax používaná ve většině jiných databázových systémů, klíčové slovo CUBE se přidává těsně za GROUP BY, před uvedením seznamu sloupců. Na slajdu č. A/25 je uveden příklad použití operátoru CUBE. Zjišťujeme datovou kostku pro počty prodaných aut pro dimenze typ auta, roku výroby a barva. Přehled je omezen na auta typu Octavia. Napravo na slajdu je zobrazen výsledek. Ve výsledku je pro hodnoty některých sloupců použito klíčové slovo ALL, které udává, že hodnoty v daném sloupci jsou agregovány. Na slajdu č. A/26 vidíme dva dotazy. V horním dotazu provádíme jednodimenzionální řez datovou kostkou pomocí klauzule HAVING. Výsledkem dotazu je 6 řádků, které vidíme dole pod dotazem. V dotazu dole na slajdu je vytvořena datová kostka za pomocí operátoru CUBE, výsledek dotazu je zobrazen v pravé části slajdu. Bíle označené řádky jsou shodné s řádky z prvního (horního) dotazu. Modře označené řádky jsou nové oproti prvnímu dotazu. 2.2 operátor ROLLUP Výpočet celé datové kostky pomocí operátoru CUBE je časově náročný a někdy nechceme využít ani všechna data, která takto získáme. Operátor ROLLUP považuje pořadí sloupců uvedených v klauzuli GROUP BY za hierarchii, sloupec uvedený více vlevo je v hierarchii výše. Operátor ROLLUP provádí agregaci pouze směrem ze shora dolů v rámci této hierarchie.
Na slajdu č A/29 je uvedena syntaxe operátoru ROLLUP. Stejně jako v případě operátoru CUBE, přesná syntaxe operátoru ROLLUP záleží na konkrétním databázovém systému. V SQL Serveru 2005 se za seznam sloupců v klauzuli GROUP BY přidají klíčová slova WITH ROLLUP. Na většině ostatních databázových serverů se přidává klíčové slovo ROLLUP těsně za GROUP BY, před uvedením seznamu sloupců. Na slajdu č. A/30 vidíme příklad použití operátoru ROLLUP. Hierarchie sloupců (1. typ automobilu, 2. rok výroby, 3. barva) je dána pořadím jejích zápisu v klauzuli GROUP BY. Výsledek dotazu obsahuje 16 řádek a je zobrazen napravo na slajdu. Po bližším prohlédnutí výsledku dotazu můžeme vypozorovat pravidlo pro výskyt ALL. Pro jednoduchost předpokládejme, že pořadí sloupců v klauzuli SELECT je shodné s pořadím sloupců v klauzuli GROUP BY, jako je tomu v našem případě. Pokud se je pro nějaký řádek hodnota nějakého sloupce ALL, poté všechny sloupce napravo do tohoto sloupce (s výjimkou sloupce udávajícího hodnotu agregační funkce) mají také hodnotu ALL. Na slajdu č. A/31 vidíme dva velmi podobné dotazy používající operátor ROLLUP. Dotazy se liší pouze v pořadí sloupců v klauzuli GROUP BY: V prvním (horním) dotazu je pořadí sloupců typ automobilu, rok výroby a barva auta, ve druhém (spodním dotazu) je prohozen druhý a třetí sloupec, výsledné pořadí je typ automobilu, rok výroby a barva auta. Výsledky obou dotazů jsou znázorněny napravo na slajdu. Modře označených šest řádků je shodných v obou dotazech a získali bychom je dotazem obsahujícím pouze klauzuli GROUP BY bez použití operátoru ROLLUP. Ve výsledku druhého dotazu nás možná překvapí řádky č. 4 a 8, které na první pohled porušují pravidlo pro výskyt ALL vysvětlené v předchozím odstavci. O chybu se nejedná, pro použití pravidla nebyl splněn předpoklad, že pořadí sloupců v klauzulích SELECT a HAVING je shodné. Na slajdu č. A/32 se nacházejí dva dotazy, demonstrující rozdíly mezi GROUP BY bez použití operátoru ROLLUP (první, horní dotaz) a s jeho použitím (druhý, dolní dotaz). Výsledky obou dotazů jsou znázorněny v pravé části slajdu. Bíle označené řádky jsou patří do výsledku obou dotazů, modře označené řádky získáme pouze druhým dotazem. Na slajdu č A/33 vidíme porovnání výsledků tří dotazů. První (levý horní) dotaz obsahuje pouze klauzuli HAVING, druhý (levý dolní) dotaz obsahuje operátor ROLLUP a třetí (pravý) dotaz obsahuje operátor CUBE. Řádky, které mají všechny tři výsledky dotazů společné jsou označeny bíle. Řádky společné pro výsledky druhého a třetího dotaz jsou označeny modře. Řádky obsažené pouze ve výsledku třetího dotazu jsou označeny fialově. Klíčové pojmy OLTP, OLAP, ROLAP, MOLAP, HOLAP datový sklad datová kostka, dimenze, tabulka faktů hvězda, vločka CUBE, ALL, ROLLUP
Otázky k rekapitulaci Upozornění: odpovědi na některé zde uvedené otázky nelze najít ve studijním textu tohoto tématického bloku. Lze je získat vlastním experimentováním se zdrojovými kódy nebo studiem doporučené literatury. Co znamenají zkratky OLTP a OLAP, jaké jsou mezi nimi rozdíly (z hlediska uložených dat, obvyklých operací, počtu a charakteristice uživatelů, požadavků na systém)? Jaké typy OLAP známe a jak se liší? K čemu slouží datový sklad, jak se pracuje s daty v něm uloženými? Co je to datové kostka, jaká data obsahuje? Jaký je rozdíl mezi datovým modelem vločky a hvězdy? Co je to 3 NF a jaký má vliv na databázi (dotazy, aktualizace)? Vysvětlete klauzuli GROUP BY a její použití. Vysvětlete operátor CUBE. Jakým způsobem lze operátor CUBE nahradit? Jaké má toto nahrazení výhody či nevýhody? K čemu se používá klíčové slovo ALL? Vysvětlete operátor ROLLUP. Jaké jsou rozdíly mezi obyčejným HAVING, CUBE a ROLLUP ? Své odpovědi zdůvodněte. Můžete přidat i syntaktické zápisy tam, kde je to vhodné. Doporučené příklady k naprogramování Následující dotazy utvořte nad databázi Northwind. 1. Navrhněte tabulky dimenzí a tabulku faktů pro vytvoření OLAP schématu. V tabulce faktů bude agregovanou hodnotou počet prodaných kusů. Napište SQL skript, které tyto tabulky vytvoří. Pokud jste vytvářeli tabulky v grafickém rozhraní, lze skript získat volbou (Skript table as). Rozhodněte se pro jeden z datových modelů (hvězda nebo vločka) a svůj výběr stručně zdůvodněte (pomocí komentářů v SQL skriptu). 2. Vytvořte SQL dotazy pro naplnění tabulek z bodu (1) daty. 3. Zformulujte 3 slovní zápisy OLAP dotazů a vyřešte je pomocí SQL. Alespoň jedno řešení použije operátor CUBE a alespoň jedno řešení použije operátor ROLLUP.
Studijní literatura [1] Polák, Chytil: Referát z předmětu Dotazovací jazyky (DBI001) vyučovaného na MFF UK. (v tomto tématickém bloku označované jako „slajdy A“, například slajd č. A/xx) https://is.vsfs.cz/auth/el/6410/leto2010/EQ_N_DS/um/DS3a.pdf [2] Miniberger: Modelování a návrh datových skladů. BIVŠ, 2010 (v tomto tématickém bloku označované jako „slajdy B“, například slajd č. B/xx) https://is.vsfs.cz/auth/el/6410/leto2010/EQ_N_DS/um/DS3b.pdf [3] Lacko: Datové sklady, analýza OLAP a dolování dat. 1. vyd. Brno : Computer Press, 2003.