Architektury a techniky DS Cvičení č. 10 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Cvičení č. 10 – úvod Schéma A_ZELEZNICE simuluje problematiku sestavování nákladních vlaků na železnici v ČR v dubnu roku Datumová část čísla vlaku zachycená atributem ID_VLAK_D je celé číslo v počtu dní od , atribut ID_VLAK_P udává pořadí vytvoření vlaku v daném kalendářním dni, atribut VUZ_DOPL_UD_LIST tabulky VOZY_VLAKY představuje zřetězené kódy doplňkových událostí na vozech vždy po 2B. Ve schématu je více než 3,5 milionu záznamů a je určeno pro výuku optimalizace příkazů SELECT.
Cvičení č. 10 – popis VLAKY vyjadřuje sestavené vlaky, tak jak byly sepsány VLAKY_UDALOSTIvystihuje události týkající se vlaku, například: 881 (kod)Předání vlaku v kontrolním bodě (vym. stanici) (počet událostí) 861Příjezd vlaku do stanice Odjezd vlaku ze stanice Odjezd výchozího vlaku Ukončení jízdy vlaku Soupis vozů výchozího vlaku Odvěšení vozu z vlaku Přivěšení vozu na vlak9738
Cvičení č. 10 – popis VOZY eviduje železniční vozy, jejich zavedení a zrušení VOZY_PRECISLOVANI eviduje přečíslování vozů a jejich důvody VOZY_UDALOSTI vystihuje události týkající se jednotlivých vozu, například: 1212 (kod)Soupis vozů výchozího vlaku502635(počet) 851Ukončení jízdy vlaku Kontrola vozů po příjezdu vlaku Výstup vozu na vlečku - odevzdávkový list Vstup vozu z vlečky - návratový list Vyložení vozu Vstup vozu na ČD Výstup vozu z ČD Podej zásilky vnitrostátní přepravy Dodej zásilky vnitrostátní přepravy Výstup zásilky mezinárodní přepravy CIM Vstup zásilky mezinárodní přepravy CIM Odvěšení vozu z vlaku Přivěšení vozu na vlak57916
Cvičení č. 10 – popis VOZY_VLAKY vystihuje přivěšování a odvěšení vozu na vlak / z vlaku Významy ostatních (číselníkových) tabulek jsou zřejmé z jejich názvu, jejich atributů a ER diagramu, který je uložen v atributu ERD tabulky A_POPIS ve schématu A_ZELEZNICE. Orientační počty řádků v tabulkách: VOZY_UDALOSTI VOZY_VLAKY VLAKY_UDALOSTI VOZY VLAKY37770 ZELEZNICNI_STANICE3686 VOZY_PRECISLOVANI464 TYPY_UDALOSTI173 VLAKOTVORNE_STANICE154 ZELEZNICE99 VUZ_DOPLN_UDALOSTI68 PROVOZNI_STAVY19 DRUH_VOZU5 LOZENI_VOZU3
Cvičení č. 10 – úkoly 1) 1.a) Zjistěte seznam všech vlaků, které přijely do žst. Břeclav hl.n. dne mezi 14 a 18 h. pohled cv10_1a (id_vlak_d, id_vlak_p, vlak_cislo, datum_prijezd) 1.b) Zjistěte prázdné vysokostěnné vozy v těchto vlacích. pohled cv10_1b(vuz_uic) 1.c) Odkud a kdy tyto vlaky vyjely pohled cv10_1c(id_vlak_d, id_vlak_p, vlak_cislo, ze_zst_nazev, do_zst_nazev) 2) Zjistěte průměrnou dobu (ve dnech do současnosti) od zavedení vozů, které v dubnu 2007 přepravovaly mrtvolu – tedy měly v kódech doplňujících událostí „Přeprava mrtvoly“ pohled cv10_2 (doba)
Cvičení č. 10 – úkoly Zjistěte největší počet vlaků, které vyjely pod stejným číslem vlaku a o jaké číslo vlaku šlo. 3) Zjistěte největší počet vlaků, které vyjely pod stejným číslem vlaku a o jaké číslo vlaku šlo. pohled cv10_3 (vlak_cislo, pocet) pohled cv10_4 (id_vlak_d, id_vlak_p, vlak_cislo, pocet_vozu, ze_zst_nazev, do_zst_nazev ) 4) Zjistěte, který vlak měl nejvíce vozů dne a odkud a kam jel. pohled cv10_4 (id_vlak_d, id_vlak_p, vlak_cislo, pocet_vozu, ze_zst_nazev, do_zst_nazev ) 5) Příklady 3) a 4) upravte pro použití příkazu SELECT s klauzulí WITH a porovnejte jejich exekuční plány. pohled cv10_3w (vlak_cislo, pocet) pohled cv10_4w (id_vlak_d, id_vlak_p, vlak_cislo, pocet_vozu, ze_zst_nazev, do_zst_nazev)
Cvičení č. 10 – příkazy s klauzulí WITH The WITH query_name clause lets you assign a name to a subquery block. You can then reference the subquery block multiple places in the query by specifying the query name. Oracle optimizes the query by treating the query name as either an inline view or as a temporary table. You can specify this clause in any top- level SELECT statement and in most types of subqueries. The query name is visible to the main query and to all subsequent subqueries except the subquery that defines the query name itself. A WITH clause is really best used when the result of the WITH query is required more than one time in the body of the query such as where one averaged value needs to be compared against two or three times.
Cvičení č. 10 – příkazy s klauzulí WITH WITH AS (subquery_sql_statement) SELECT FROM ; Příklad: select store_name, sum(quantity) store_sales, (select sum(quantity) from sales)/(select count(*) from store) avg_sales from store s, sales sl where s.store_key = sl.store_key having sum(quantity) > (select sum(quantity) from sales)/(select count(*) from store) group by store_name
Cvičení č. 10 – příkazy s klauzulí WITH WITH sum_sales AS select /*+ materialize */ sum(quantity) all_sales from stores, number_stores AS select /*+ materialize */ count(*) nbr_stores from stores, sales_by_store AS select /*+ materialize */ store_name, sum(quantity) store_sales from store natural join sales SELECT store_name FROM store, sum_sales, number_stores, sales_by_store WHERE store_sales > (all_sales / nbr_stores);