Databázové systémy II Přednáška č. IX Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky
Osnova přednášky Analytické funkce IDAS - Přednáška IX
Analytické funkce DBMS Oracle obsahuje novou řadu analytických funkcí, jenž dovolují spočítat následující typy početních operací: – Žebříčky a percentily (Rankings and percentiles) – Výpočty v „pohyblivých oknech“ (Moving window calculations) – Analýza předchůdce/následníka (Lag/lead analysis) – Analýza prvního/posledního (First/last analysis) – Lineární regrese (Linear regression statistics) Nové analytické funkce jsou optimalizovány na výkon. – Analytické funkce podporují paralelizaci. – Zpracování dotazů je pak efektivnější, dotazy jednoduší a celý systém je lépe škálovatelný. IDAS - Přednáška IX
Analytické funkce Jaký mají nové analytické funkce přínos pro uživatele? – Klasickým problémem agregačních funkcí (používaných v kombinaci s GROUP BY je ztráta detailu). – Typickým příkladem může být vypsání všech zaměstnanců spolu s jejich průměrnou mzdou (např. na oddělení kde pracuji, …). – Umožňují definovat velmi specifické výpočty. Např.: Sumu složenou s okolních hodnot aktuální hodnoty. Analýza top-n výsledků. Výběr nejvyšší a nejnižší hodnoty ze specifikované skupiny. IDAS - Přednáška IX
Analytické funkce Motivační příklad: – Chci vypsat všechny zaměstnance ve firmě a ke každému uvést: Průměrnou mzdu oddělení ve kterém pracuje. Průměrnou mzdu pozice na které pracuje. Průměrnou mzdu země ve které zaměstnanec pracuje. Rozdíl mzdy zaměstnance se mzdou třetího nejlépe placeného zaměstnance firmy. – S klasickými agregačními funkcemi (GROUP BY) je napsání odpovídajícího dotazu velmi komplikované. – V podstatě to znamená, k základnímu výpisu (1 dotaz) připojit výsledky čtyř sub-dotazů. Ke zodpovězení dotazu je nutné napsat 5 dotazů. – Nejen že je to komplikované (výsledný kód je nepřehledný, náchylný na chyby), ale celkově je toto řešení i nevýkonné. IDAS - Přednáška IX
Analytické funkce Předchozí příklad řešený analytickými funkcemi IDAS - Přednáška IX
Analytické funkce Obecná syntaxe: query_partition_clause – Rozděluje výslednou sadu dat do oddílů. Použitá analytická funkce se pak aplikuje stejně na všechny oddíly. Funkce nikdy nepřesáhne hrabice oddílu. Při vynechání se funkce aplikuje na celou sadu dat. order_by_clause – Definuje pořadí uvnitř jednotlivých oddílů. Využíva se především u funkcí, jenž jsou citlivé na pořadí analyzovaných dat. Funkce RANK, FIRST_VALUE, … windowing_clause – Umožňuje jemnější specifikaci toho, s jakými řádky analytická funkce bude pracovat (vždy ale v rámci zvoleného oddílu a pořadí). – Umožňuje např. specifikovat, že funkce se aplikuje na aktuální řádek, na řádek přímo předcházející a přímo následující. IDAS - Přednáška IX
Zpracování analytických dotazů Rozdělení výsledků do oddílů/oblastí (PARTITIONS) – Analytické funkce umožňují rozdělit výsledky dotazu na skupiny řádků, nazvané oddíly (partitions). (neplést a nespojovat s pojmem partition table). – Oddíly jsou vytvořeny na základě výrazů v PARTITION BY klauzuli. – Množina výsledků může být rozdělena na mnoho oddílů uchovávajících jen pár řádků, do několika větších oddílů či mohou zůstat jen v jednom oddílu. IDAS - Přednáška IX
Zpracování analytických dotazů Okno (Window) – Pro každý řádek v oddílu, může uživatel definovat „posuvné okénko“. – Toto okénko určuje rozsah řádků (před/za aktuálním), které budou složit pro výpočet hodnot na řádku aktuálním. – Každé okénko má svůj počáteční řádek a svůj konečný řádek. – Velikost okénka může být založena na konkrétní fyzické hodnotě (počet řádků) či hodnotě logické (čas). – Příkladem může být funkce kumulativního součtu. Začátek okénka se pevně definuje na začátek oddílu, konečný bod se bude pohybovat s aktuálním záznamem od začátku oddílu k jeho konci. – Okénko může být stejně velké jako celý oddíl. Může též mít velikost jednoho řádku oddílu. IDAS - Přednáška IX
Zpracování analytických dotazů Aktuální řádek (Current row) – Každý výpočet provedený analytickou funkcí je založen na hodnotě aktuálního řádku oddílu. – Aktuální řádek slouží jako referenční bod ovlivňující počáteční a koncový bod okénka. – Okénku může být například definováno tak, že obsahuje aktuální záznam, šest záznamů které mu předcházejí a šest záznamů které se nacházejí v pořadí za ním. IDAS - Přednáška IX
Zpracování analytických dotazů IDAS - Přednáška IX
Zpracování analytických dotazů Nové analytické funkce přidávají do zpracovávacího řetězce dotaz řadu nových elementů. Diagram zpracování dotazů s novým analytickými funkcemi: Pořadí zpracování 1.Nejprve jsou provedeny klasická spojení, filtrovaní, seskupení a filtrování seskupených informací. 2.Výsledek z prvního kroku je podroben zpracovaní analytickými funkcemi. 3.Závěrečné seřazení. IDAS - Přednáška IX
Funkce pro určení pořadí Určují pořadí dané hodnoty ve specifikované množině výsledků, která je seřazena podle specifického pořadí. Dostupné funkce: – RANK – DENSE_RANK – CUME_DIST – PERCENT_RANK – NTILE – ROW_NUMBER IDAS - Přednáška IX
RANK Funkce RANK umožní vypočítat pořadí daného řádků ve specifikované skupině, na základě hodnoty ve vybraném sloupci. – Pořadí obchodů dle příjmů v jednotlivých státech. Syntaxe: Funkce RANK vytváří tzv. nevyužitá místa. – Tři obchody se v prodejích umístili na druhém místě, další obchod v pořadí je pátý. IDAS - Přednáška IX
RANK Základní vlastnosti funkce RANK: – Výchozím typem řazení záznamů je řazení sestupné. – PARTITION BY výraz může data rozdělit do skupin, ve kterých bude funkce RANK individuálně vypočítávat pořadí. – De facto PARTITION BY definuje hranice, na kterých dojde k „resetování“ pořadí. – ORDER BY klauzule funkce RANK specifikuje veličinu (veličiny) podle které jsou záznamy ve skupinách seřazeny a následně „ohodnoceny“. – Klauzule NULLS FIRST | NULLS LAST klauzule ORDER BY říkají, kam se mají umístit záznamy obsahující NULL hodnoty. – Pokud jsou NULLS FIRST | NULLS LAST vynechány, záleží řazení NULL hodnot na typu řazení (ASC|DESC). – NULL hodnota je považována za větší než jakákoliv jiná definovaná hodnota. IDAS - Přednáška IX
RANK IDAS - Přednáška IX
RANK a PARTITION BY IDAS - Přednáška IX
RANK a DENSE_RANK RANK vynechává pořadí, pokud se na stejné pozici objeví více záznamů. DENSE_RANK pořadí nevynechává. IDAS - Přednáška IX
Funkce PERCENT_RANK Výpočet percentilu. – Percentil - vyjadřuje postavení daného prvku vůči prvkům ostatním. Jinak vyjádřeno říká, kolik procent záznamů následuje za aktuálním prvkem. (95. percentil říká, že 95% prvků je za aktuálním prvkem a jen 5% prvků je před aktuálním prvkem). Matematicky vyjádřeno: Syntaxe: Funkce vrací hodnoty v rozmezí IDAS - Přednáška IX
Funkce NTILE Rozdělení řádků oddílů do přibližně stejně velkých skupin. – Ze statistického pohledu jde o rozdělení výběru na kvantily - medián, kvartil, kvintil, decil, percentil. Funkce přímá jako argument číslo, které definuje počet skupin, do kterých má být oddíl rozdělen. Výstupem funkce je číslo reprezentující příslušnost daného řádku ke skupině. Syntaxe: IDAS - Přednáška IX
Funkce NTILE IDAS - Přednáška IX
Funkce NTILE Pokud nelze řádky rozdělit rovnoměrně (beze zbytku), pak probíhá zvýšení kapacity prvních skupin. – O jedničku je zvětšena kapacita n prvních skupin, kde n je rovno velikosti zbytku. – Příklad: 103 řádků rozdělit do 5 skupin (zbytek bude 3). První skupina bude mít 21 řádků, 2. 21, 3. 21, 4. a 5. budou mít po dvaceti řádkách. Pozor na řazení hodnot podle položek, které nejsou primární klíče. – Stejné hodnoty se pak mohou objevovat v různých skupinách. Pro zajištění deterministického chování je nutno použit sloupce, jenž obsahuje unikátní hodnoty (nejlépe PK). IDAS - Přednáška IX
Funkce ROW_NUMBER Umožňuje přiřadit každému řádku v oddílu unikátní číslo (sekvenčně přiřazované od 1, v závislosti na ORDER BY klauzuli). Syntaxe: Opět pozor na řazení dle neunikátních sloupců. Řádky se shodnými hodnotami ve sloupcích řazení mohou pokážde obdržet jinou hodnotu funkce ROW_NUMBER. IDAS - Přednáška IX
Funkce ROW_NUMBER IDAS - Přednáška IX
Windowing Tzv. „windowing functions“ se vyžívají při výpočtech kumulativních, pohyblivých a centrických agregací. Základním principem těchto funkcí je, že výsledná hodnota nezáleží jen na aktuální hodnotě daného řádku, ale je ovlivňována navíc i okolními řádky, které spadají do tzv. okna. Windowing je využitelné se všemi klasickými funkcemi (SUM, AVG, COUNT, MAX, MIN, …). Mohou se vyskytnout pouze v SELECT a ORDER BY klauzuli dotazu. Tyto funkce navíc zahrnují funkci FIRST_VALUE, která vrací první hodnotu okna, a funkci LAST_VALUE, obsahující poslední hodnotu okna. Tyto funkce umožňují efektivně zpřístupňovat více řádků najednou bez použití self-join. IDAS - Přednáška IX
Windowing IDAS - Přednáška IX
Windowing - logický offset IDAS - Přednáška IX
Windowing - logický offset IDAS - Přednáška IX
Windowing - centrické agr. funkce Dané okno je definováno tak, že aktuální řádek je středem tohoto okna. IDAS - Přednáška IX
Windowing - centrické agr. funkce Okno je definováno na tři dny (včerejšek, dnešek, zítřek). – Daný průměr se tedy počítá ze tří dní. Pozor na řádky na krajích okna, zde se počítá průměr jen ze dvou dní. – V případě prvního řádku - dnešek, zítřek. – V případě posledního řádku - včerejšek, dnešek. IDAS - Přednáška IX
Windowing a přítomnost duplicit Uvažme následující SQL příkaz a jeho výstup: IDAS - Přednáška IX
Windowing a přítomnost duplicit Tento výsledek je způsoben použitím klíčového slova RANGE. Při použití RANGE může dané okno potencionálně držet řádků pro každou hodnotu z rozsahu. IDAS - Přednáška IX
Proměnná velikost okna V určitých situací je vhodné, aby se velikost okna přizpůsobila specifické hodnotě v daném řádku. IDAS - Přednáška IX Funkce fn může například vracet: Hodnotu 4, když je t_timekey pracovním dnem. Jinak vrací 2.
Reporting/Reportovací funkce Reportovací agregační funkce mají stejné vlastnosti jako jejich klasické protějšky (SUM, AVG, …) – Není u nich nutné využívat klauzuli GROUP BY. – Jejich výsledek je uveden v každém řádku daného oddílu. Typická syntaxe: IDAS - Přednáška IX Význam o omezení: * je povoleno jen u COUNT(*) DISTINCT je povolen, jen když je podporován příslušnou funkcí. PARTITION BY klauzule definuje skupiny, v rámci kterých „okenní“ funkce provedou výpočty. Vynechání klauzule = všechny řádky.
Reporting/Reportovací funkce Reportovací funkce se mohou objevit pouze v SELECT klauzuli nebo v ORDER BY klauzuli. Hlavní výhodou těchto funkcí je schopnost vícenásobného průchodu dat v rámci jednoho dotazovacího bloku. – Zvýšení rychlosti provádění dotazů. – Není nutné využívat spojení mezi různými dotazovacími bloky. IDAS - Přednáška IX
Reporting/Reportovací funkce Sub-dotaz vrátí následující výsledky: IDAS - Přednáška IX
Reporting/Reportovací funkce Konečný výsledek dotazu: IDAS - Přednáška IX
Funkce RAITO_TO_REPORT Funkce vypočítá poměr mezi zadanou hodnotou a sumou hodnot ve skupině. Syntaxe: Význam: – expr - libovolný výraz – PARTITION BY - definuje skupinu, pro kterou je RATIO_TO_REPORT počítano. IDAS - Přednáška IX
Funkce RATIO_TO_REPORT IDAS - Přednáška IX
Funkce LAG/LEAD Užitečné funkce pro porovnávání aktuální hodnoty s hodnotou z řádku o n pozic před/za aktuálním řádku. Přestože funkce provádí přístup k více řádkům tabulky současně, není nutné využít self-join. – Vyšší výkon dotazů využívající LAG/LEAD. LAG poskytuje přístup na řádek o n pozic před aktuálním záznamem. LEAD naopak k záznamům za akt. záznamem. Syntaxe: IDAS - Přednáška IX
Funkce LAG/LEAD Význam jednotlivých parametrů LAG/LEAD: – offset - volitelný, výchozí hodnota 1, definuje o kolik pozic je hledaná hodnota posunuta vůči aktuální. – default - tato hodnota je vrácena, pokud je offset mimo platné hranice tabulky nebo definovaného oddílu. – Při specifikaci IGNORE NULLS bude všechny NULL hodnoty ignorovány a nebudou se započítávat do offsetu. IDAS - Přednáška IX
Funkce LAG/LEAD IDAS - Přednáška IX
Funkce FIRST_VALUE a LAST_VALUE Výběr prvního řádku (FIRST_VALUE) nebo posledního řádku (LAST_VALUE) z definovaného okna. – Příklad: Porovnaní každodenních prodejů s prodeji z prvního dne definované periody. Syntaxe: IGNORE NULLS vrátí první (FIRST_VALUE) NOT NULL hodnotu nebo první NOT NULL hodnotu od konce (LAST_VALUE). IDAS - Přednáška IX
Funkce FIRST_VALUE a LAST_VALUE IDAS - Přednáška IX
NTH_VALUE Umožňuje nalézt specifický řádek (dle pořadí) v definovaném okně. – Příklad: Třetí nejpracovitější zaměstnanec v oddělení. Syntaxe: Význam – expr - výraz, jehož hodnotu hledáme. – n - daná pozice (offset). – RESPECT NULLS - výchozí chování, rozhoduje o tom, zda jsou při kalkulaci pozice brány v úvahu i řádky obsahující NULL hodnotu. – FROM FIRST/FROM LAST - Definují, zdali se offset uplatňuje od počátku nebo konce okna. IDAS - Přednáška IX
Pokročilé funkce Pokročilé agregační funkce pro analýzu: – LISTAGG – FIRST/LAST – Inverzní percentil – Hypotetický Rank – Lineární regrese – Statistická agregace – Uživatelsky definovaná agregace Více o pokročilých funkcích: – IDAS - Přednáška IX
Funkce LISTAGG Serializace hodnot okna do jednoho řádku. Syntaxe: Význam: – expr - výraz, jenž bude serializován. – delimiter - oddělovač, jenž bude výrazy z jednotlivých řádků oddělovat. – oby_expression_list - definuje pořadí, v jakém budou jednotlivé výrazy seřazeny. IDAS - Přednáška IX
Funkce LISTAGG IDAS - Přednáška IX
Funkce FIRST/LAST Funkce FIRST/LAST umožňují nejprve stanovit pořadí řádků v určité množině a pak následně pracovat s jejími nejlépe či nejhůře hodnocenými prvky. Tabulku můžeme pomocí funkcí FIRST/LAST nejprve „ohodnotit“ podle sloupce A, ale následná agregační funkce bude pracovat se sloupcem B (s nej-hodnotami podle A). Hlavním přínosem funkcí FIRST/LAST je možnost vyhnout se použití spojení SELF JOIN. Syntaxe začíná klasickou agregační funkcí (která produkuje jedno řádkový výstup za skupinu). Pro specifikaci pořadí se využije nová klauzule KEEP. IDAS - Přednáška IX
Funkce FIRST/LAST Syntaxe: IDAS - Přednáška IX
Funkce FIRST_LAST IDAS - Přednáška IX Následující dotaz vypočítavá následující sloupce: Ceníkovou cenu produktu s nejnižší minimální cenou. Nejnižší minimální cenu. Ceníkovou cenu produktu s nejvyšší minimální cenou. Nejvyšší minimální cenu.
Funkce FIRST/LAST IDAS - Přednáška IX Význam sloupců ve výsledku: Ceníkovou cenu produktu s nejnižší minimální cenou. Nejnižší minimální cenu. Ceníkovou cenu produktu s nejvyšší minimální cenou. Nejvyšší minimální cenu.
Dovětek k analytickým funkcím Při využívání pokročilých analytických funkcí je třeba mít na paměti následující: – Zkontrolovat si, jakým způsobem daná funkce reaguje na NULL hodnoty a jaké má možnosti práce s nimi. – Jak daná funkce pracuje s duplicitami. Typicky při seřazení podle neunikátního klíče (jako třeba mzda), můžeme narazit na stejné hodnoty - a jak se pak zachová hodnota? Vrátí všechny řádky odpovídající stejné mzdě (windowing klauzule) nebo vrátí jen jeden řádek (funkce FIRST_VALUE)? A který? IDAS - Přednáška IX
Statistické funkce MEDIAN – Ze seřazené řady hodnot vrátí funkce tu hodnotu, jenž se nachází uprostřed řady. STATS_MODE – Modus. Funkce vrátí hodnotu, jenž se ve statistickém souboru hodnot vyskytuje nejčastěji. Shrnutí statistických funkcí: – IDAS - Přednáška IX