Dnes: 17. prosince 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    SQL
    (Structured Query Language)

    Jedná se o neprocedurální jazyk, používaný v databázových technologiích. Počátky tohoto jazyka spadají do druhé poloviny minulého století.

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    Tipy a triky pro Oracle III. – analytické funkce poprvé


    [Tipy - triky] - Ve třetím pokračování nového seriálu věnovaného praktickým tipům a trikům pro databázovou platformu Oracle Database se podíváme na to, jak vám v Oracle mohou pomoci analytické funkce vyhnout se komplikovaným dotazům. Cílem seriálu je přinášet vám nejen praktické informace, které vám mohou pomoci při správě či vývoji na této platformě, ale také upozorňovat na zajímavé funkce. O kterých možná ani nevíte, že existují.



    S rastúcim nasadením informačných technológií do obchodnej praxe rastie aj náročnosť požiadavkov užívateľov. Okrem súm a priemerov ich začínajú zaujímať kumulované sumy, vážené priemery, podiel na trhu... A vývojár vnára dotaz do dotazu. Keby len to! Dokonca ich tieto výpočty zaujímajú vzhľadom na rôzne dimenzie a granularity – v jednom reporte kumulované sumy po jednotlivých mesiacoch, vážené priemery po predajcoch.

    V tomto momente začína vývojár narážať na hranice ANSI SQL. Databáza Oracle ponúka rozšírenie SQL o tzv. analytické funkcie, ktoré sú určené na uspokojenie náročného spotrebiteľa reportov. Aj keď sa na prvý pohľad môže zdať, že ide o bežné sumarizačné funkcie, pri podrobnejšom skúmaní syntaxu zistíme, že ich záber a využitie je oveľa širšie.

    Skúsme splniť dve zadania bez použitia a s použitím analytických funkcií nad skúšobnou schémou HR:

    1. HR potrebuje report o vzťahu medzi počtom zamestnancov (tak ako rástla firma) a nákladmi na platy t.j. kumulatívnu sumu platov.
    2. HR dostalo úlohu vyrovnať platy zamestnancov v jednotlivých oddeleniach na úroveň druhého najlepšie plateného zamestnanca v oddelení.

    Skôr ako začneme, skúste porozmýšľať ako by ste sami riešili takéto zadanie.

    Prvú úlohu môžeme riešiť pomocou štandartného SQL napr. nasledovným dotazom. Na zistenie sumy všetkých predošlých platov využijeme spojenie tej istej tabuľky za podmienky, že k jednému riadku sa pripoja všetky riadky s nižším alebo rovným poradovým číslom:

    SELECT 	b.employee_id,
            b.last_name, b.salary, 
            SUM(a.salary) as cum_sal
      FROM employees a, employees b
      WHERE a.employee_id <= b.employee_id
      GROUP BY b.employee_id, b.salary,b.last_name
      ORDER BY b.employee_id;
    

    Náklady tohto dotazu:

    ----------------------------------------------------------------------
    |Id |Operation                 | Name          |Rows| Bytes|Cost(%CPU)| 
    -----------------------------------------------------------------------
    | 0 |SELECT STATEMENT          |               | 572| 13728|   7  (15)| 
    | 1 | SORT GROUP BY            |               | 572| 13728|   7  (15)| 
    | 2 |  TABLE ACCESS BY INDEX RW| EMPLOYEES     |   5|    80|   2   (0)| 
    | 3 |   NESTED LOOPS           |               | 572| 13728|   6   (0)| 
    | 4 |    TABLE ACCESS FULL     | EMPLOYEES     | 107|   856|   3   (0)| 
    |*5 |    INDEX RANGE SCAN      | EMP_EMP_ID_PK |   5|      |   1   (0)| 
    -----------------------------------------------------------------------
    

    Naproti tomu pri využití analytických funkcií stačí zadefinovať spôsob usporiadania (ORDER BY) a zadefinovať, ktoré riadky vstupujú do výpočtu (ROWS). V našom prípade sú to všetky predchádzajúce (UNBOUNDED PRECEDING), ale mohli by sme povedať, že je to napr. predchádzajúcich päť alebo ľubovoľnú inú podmienku tzv. "windowing":

    SELECT employee_id, 
           last_name, salary,
           SUM(salary) OVER(
                         ORDER BY employee_id 
                         ROWS UNBOUNDED PRECEDING) 
             as cum_salary
      FROM hr.employees
      ORDER BY EMPLOYEE_ID;
    

    Náklady tohto dotazu:

    ---------------------------------------------------------------------
    | Id  | Operation          | Name      | Rows  | Bytes | Cost (%CPU)|
    ---------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |           |   107 |  1712 |     3   (0)|
    |   1 |  WINDOW SORT       |           |   107 |  1712 |     3   (0)|
    |   2 |   TABLE ACCESS FULL| EMPLOYEES |   107 |  1712 |     3   (0)|
    ---------------------------------------------------------------------
    

    Keď porovnáme spotrebu zdrojov jedného a druhého dotazu, zistíme, že analytická funkcia je o viac ako 50% úspornejšia (Cost 7 vs. 3), lebo pri jej výpočte sa cez spracovávanú množinu dát prechádza iba raz.

    Druhé zadanie môžeme riešiť tak, že si nájdeme najlepšie zaplatených ľudí a nájdeme ľudí s najvyšším platom, ktorý je menší ako plat najlepšie zaplatených.

    SELECT MAX(e.salary), 
           e.department_id
      FROM
        (SELECT MAX(salary) max_salary, 
                department_id 
           FROM employees
           GROUP BY department_id
         ) m,
           employees e
      WHERE
        e.department_id=m.department_id AND
        e.salary<m.max_salary
      GROUP BY e.department_id;
    

    Náklady tohto dotazu:

    ---------------------------------------------------------------------
    |Id |Operation              |Name      | Rows  | Bytes | Cost (%CPU)|
    ---------------------------------------------------------------------
    | 0 |SELECT STATEMENT       |          |    11 |   253 |     8  (25)|
    | 1 | SORT GROUP BY NOSORT  |          |    11 |   253 |     8  (25)|
    | 2 |  MERGE JOIN           |          |    17 |   391 |     8  (25)|
    | 3 |   SORT JOIN           |          |    11 |   176 |     4  (25)|
    | 4 |    VIEW               |          |    11 |   176 |     4  (25)|
    | 5 |     HASH GROUP BY     |          |    11 |    77 |     4  (25)|
    | 6 |      TABLE ACCESS FULL|EMPLOYEES |   107 |   749 |     3   (0)|
    |*7 |   FILTER              |          |       |       |            |
    |*8 |    SORT JOIN          |          |   107 |   749 |     4  (25)|
    | 9 |     TABLE ACCESS FULL |EMPLOYEES |   107 |   749 |     3   (0)|
    ---------------------------------------------------------------------
    

    Pri riešení s použitím analytických funkcií si riadky rozdelíme po oddeleniach (PARTITION BY), riadky v jednotlivých particiach (Pozor: particiovanie v analytických funkciách nemá nič spoločné s tabuľkovými partíciami), zoradíme zostupne podľa platu (ORDER BY) a každému riadku priradíme poradové číslo použitím riadkovej funkcie ROW_NUMBER(). Výhodou tohto riešenia je, že sa môžeme dotazovať s rovnakými procesnými nákladmi na 3., 4. .. entý riadok v poradí.

    SELECT salary, department_id
      FROM
        (SELECT salary, 
                department_id,
                ROW_NUMBER() OVER(
                  PARTITION BY department_id
                  ORDER BY salary DESC) 
                   as poradie
           FROM employees
        )
      WHERE poradie=2;
    

    Náklady tohto dotazu:

    -----------------------------------------------------------------------
    |Id |Operation                |Name      | Rows  | Bytes | Cost (%CPU)|
    -----------------------------------------------------------------------
    | 0 |SELECT STATEMENT         |          |   107 |  4173 |     4  (25)|
    |*1 | VIEW                    |          |   107 |  4173 |     4  (25)|
    |*2 |  WINDOW SORT PUSHED RANK|          |   107 |   749 |     4  (25)|
    | 3 |   TABLE ACCESS FULL     |EMPLOYEES |   107 |   749 |     3   (0)|
    ------------------------------------------------------------------------
    

    Opätovne vidíme, že analytická funkcia je signifikantne menej náročná na systémové zdroje (Cost 8 vs. 4). V prostredí reportingu nad dátovým skladom, kde sa bežne stretávame s miliónmi záznamov, môže takáto úspora znamenať skrátenie spracovania z desiatok minút na desiatky sekúnd.

    Ako každá iná sofistikovaná vlastnosť systému nemôžu analytické funkcie nahradiť vynaliezavosť a zručnosť vývojára, ale môžu mu podstatným spôsobom rozšíriť jeho možnosti.

    Dokumentáciu od analytických funkcií nájdete v Oracle Database Data Warehousing Guide (kapitola 21 SQL for Analysis and Reporting).

    Dnešní ukázky můžete vyzkoušet na libovolné edici Oracle Database, včetně volně dostupné Express Edition. V případě potřeby si Oracle Database můžete stáhnout na webu společnosti Oracle.

    O autorovi
    Peter Hora pôsobí ako BI/DW Solutions Architect. Svoje štúdia absolvoval na Slovensku, v Izraeli, Holandsku a Českej Republike. Od ich ukončenia sa zaoberá problematikou business intelligence a datawarehousingu s primárnym zameraním na finančný sektor (dátová konsolidácia, New Basel Capital Accord , profitabilita ...)

    Související články:
    Tipy a triky pro Oracle XVI. – rychlejší aplikace i bez změn dotazů podruhé (03.02.2009)
    Tipy a triky pro Oracle XV. – rychlejší aplikace i bez změn dotazů poprvé (21.11.2008)
    Tipy a triky pro Oracle XIV. – datová komprese (21.10.2008)
    Tipy a triky pro Oracle XIII. – externí data rychle (17.09.2008)
    Tipy a triky pro Oracle XII. – Jak na řízení přístupu na úrovni záznamů? (15.04.2008)
    Tipy a triky pro Oracle XI. – Error Logging Tables (12.11.2007)
    Tipy a triky pro Oracle X. – bojujete s češtinou v Oracle podruhé? (14.05.2007)
    Tipy a triky pro Oracle IX. – bojujete s češtinou v Oracle? (06.02.2007)
    Tipy a triky pro Oracle VIII. – jak na přenosy velkých dat podruhé (03.01.2007)
    Tipy a triky pro Oracle VII. – jak na přenosy velkých dat poprvé (21.11.2006)
    Tipy a triky pro Oracle VI. – trochu jiné triggery (25.09.2006)
    Tipy a triky pro Oracle V. – změna dat v pohledu? (06.09.2006)
    Tipy a triky pro Oracle IV. – analytické funkce podruhé (14.08.2006)
    Tipy a triky pro Oracle II. – jak na hierarchické struktury? (07.06.2006)
    Tipy a triky pro Oracle I. – jak na automatické přidělování ID? (05.05.2006)

    ( Celý článek! | Autor: Peter Hora | Počet komentářů: 16 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (1507 hl.)
    Do 1 000,- Kč 
     (1044 hl.)
    Do 10 000,- Kč 
     (978 hl.)
    Do 25 000,- Kč 
     (1347 hl.)
    Do 50 000,- Kč 
     (994 hl.)
    Do 75 000,- Kč 
     (1151 hl.)
    Více než 75 000,- Kč 
     (993 hl.)

    Celkem hlasovalo: 8014


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Prosinec  >>
    PoÚtStČtSoNe
        123
    45678910
    11121314151617
    18192021222324
    25262728293031

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena