Tabulka fotbalové ligy

Podobné dokumenty
Databázové systémy II. KIV/DB2 LS 2007/2008. Zadání semestrální práce

2. blok část B Základní syntaxe příkazů SELECT, INSERT, UPDATE, DELETE

Optimalizace dotazů a databázové transakce v Oracle

Databázové systémy, MS Access. Autor: Ing. Jan Nožička SOŠ a SOU Česká Lípa VY_32_INOVACE_1130_Databázové systémy, MS Access_PWP

Verzování a publikace dat na webu za pomoci PostgreSQL

Obchodní akademie a Jazyková škola s právem státní jazykové zkoušky Jihlava

Informační systémy 2008/2009. Radim Farana. Obsah. Jazyk SQL

Vzorové příklady SQL. Tabulka: Kniha CREATE TABLE kniha (id INTEGER, název VARCHAR(50), PRIMARY KEY (id))

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

6. SQL složitější dotazy, QBE

PG 9.5 novinky ve vývoji aplikací

PostgreSQL. Podpora dědičnosti Rozšiřitelnost vlastní datové typy. Univerzální nasazení ve vědecké sféře

Databáze I. Přednáška 7

1. Relační databázový model

7. Integrita a bezpečnost dat v DBS

7. Integrita a bezpečnost dat v DBS

Čteme EXPLAIN. CSPUG, Praha. Tomáš Vondra Czech and Slovak PostgreSQL Users Group

Databáze 2011/2012 SQL DDL (CREATE/ALTER/DROP TABLE), DML (INSERT/UPDATE/DELETE) RNDr.David Hoksza, Ph.D.

Návrh a tvorba WWW stránek 1/14. PHP a databáze

Kurz Databáze. Obsah. Dotazy. Zpracování dat. Doc. Ing. Radim Farana, CSc.

Semestrální práce z DAS2 a WWW

Databázové systémy I

Jazyk SQL slajdy k přednášce NDBI001

DJ2 rekurze v SQL. slajdy k přednášce NDBI001. Jaroslav Pokorný

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

Tvorba informačních systémů

Databáze I. Přednáška 4

Západočeská univerzita v Plzni Katedra informatiky a výpočetní techniky. 9. června krovacek@students.zcu.cz

Databázové a informační systémy

Stored Procedures & Database Triggers, Tiskové sestavy v Oracle Reports

SQL. strukturovaný dotazovací jazyk. Structured Query Language (SQL)

Databázové systémy a SQL

Použití databází na Webu

InnoDB transakce, cizí klíče, neumí fulltext (a nebo už ano?) CSV v textovém souboru ve formátu hodnot oddělených čárkou

Vkládání, aktualizace, mazání

DPKOM_06 Dědičnost entit a zpětná volání posluchači

FAKULTA STAVEBNÍ STUDIJNÍ PROGRAM: GEODÉZIE A KARTOGRAFIE TYP PROGRAMU: MAGISTERSKÝ STUDIJNÍ OBOR: GEOMATIKA ÚVOD DO ZPRACOVÁNÍ PROSTOROVÝCH DAT

Gymnázium a Střední odborná škola, Rokycany, Mládežníků 1115

2. přednáška. Databázový přístup k datům (SŘBD) Možnost počítání v dekadické aritmetice - potřeba přesných výpočtů, např.

Dotazovací jazyk SQL I

B0M33BDT Technologie pro velká data. Supercvičení SQL, Python, Linux

Zadání úlohy do projektu z předmětu IPP 2013/2014

Michal Krátký. Tvorba informačních systémů, 2008/2009. Katedra informatiky VŠB Technická univerzita Ostrava. Tvorba informačních systémů

Jazyk S Q L základy, příkazy pro práci s daty

8. Zpracování dotazu. J. Zendulka: Databázové systémy 8 Zpracování dotazu 1

Inovace a zkvalitnění výuky prostřednictvím ICT. Základní seznámení s MySQL Ing. Kotásek Jaroslav

Databázové systémy Cvičení 5.2

INDEXY JSOU GRUNT. Pavel Stěhule

Úvod do databázových systémů

Konceptuální modelování a SQL

Databázové systémy. Cvičení 6: SQL

Databázové systémy. Integritní omezení. Vilém Vychodil. V. Vychodil (KMI/DATA1, Přednáška 9) Integritní omezení Databázové systémy 1 / 33

Databáze SQL SELECT. David Hoksza

Co se stane po jeho vykonání? Vyberte libovolný počet možných odpovědí. Správná nemusí být žádná, ale také mohou být správné všechny.

Michal Krátký, Miroslav Beneš

U koly na procvic ení jazyka T-SQL

Object-relational mapping (JPA, Hibernate)

RELAČNÍ DATABÁZOVÉ SYSTÉMY

Nasazení Object Relation Mapping nástrojů nad legacy datovým modelem

Transformace konceptuálního modelu na relační

Sada 1 - PHP. 14. Úvod do jazyka SQL

- sloupcové integritní omezení

Úvod do databází. Modelování v řízení. Ing. Petr Kalčev

J. Zendulka: Databázové systémy 8 Zpracování dotazu Podstata optimalizace zpracování dotazu

MySQL sežere vaše data

Databáze. Velmi stručný a zjednodušený úvod do problematiky databází pro programátory v Pythonu. Bedřich Košata

zobrazení délky ve výpisu v psql

Základy informatiky. 08 Databázové systémy. Daniela Szturcová

Co bude výsledkem mého SELECTu? RNDr. David Gešvindr MVP: Data Platform MCSE: Data Platform MCSD: Windows Store MCT

TimescaleDB. Pavel Stěhule 2018

Novinky v PostgreSQL 9.4. Tomáš Vondra, 2ndQuadrant

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Databázové systémy. Dotazovací jazyk SQL - III

VYSOKÁ ŠKOLA BÁŇSKÁ TECHNICKÁ UNIVERZITA OSTRAVA HORNICKO GEOLOGICKÁ FAKULTA INSTITUT GEOINFORMATIKY. Prostorové databáze

Jazyk SQL 3 - DML, DDL, TCL, DCL

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

Databáze 2011/2012 T-SQL - kurzory, funkce. RNDr.David Hoksza, Ph.D.

Kapitola 6: Omezení integrity. Omezení domény

Zobrazování dat pomocí tabulek

Marian Kamenický. Syntea software group a.s. marian.kamenicky. MFFUK Praha 2012/13

4IT218 Databáze. 4IT218 Databáze

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Virtual Private Database (VPD) Jaroslav Kotrč

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MySQL základní pojmy, motivace Ing. Kotásek Jaroslav

Zápisování dat do databáze

Univerzita Pardubice. Fakulta elektrotechniky a informatiky

Kód v databázi. RNDr. Ondřej Zýka

DBS Transformace konceptuálního schématu na

Osnova je orientační pro FIT, u FEKTu se dá předpokládat, že budou zohledněny předchozí znalosti studentů, kde většina s databází nikdy přímo

Dotazy v SQL. Výraz relační algebry R1( )[A1,A2,...,Aj] lze zapsat takto: SELECT A1,A2,...,Aj FROM R1 WHERE. Výraz (R1, R2... Rk)( )[A1,A2,...

Kapitola 4: SQL. Základní struktura

DOKUMENTACE. Úvod do zpracování prostorových dat (153UZPD) PROJEKT

6. blok část B Vnořené dotazy

UNIVERZITA PALACKÉHO V OLOMOUCI

Databázové systémy trocha teorie

IDS optimalizátor. Ing. Jan Musil, IBM ČR Community of Practice for

Základní přehled SQL příkazů

SQL v14. 4D Developer konference. 4D Developer conference 2015 Prague, CZ Celebrating 30 years

8.2 Používání a tvorba databází

Transkript:

Semestrální práce na X36DB2 Michal Rezler Jan Zmátlík Tabulka fotbalové ligy a tabulka střelců 8. prosinec 2011

Obsah 1 Zadání....................................................... 3 1.1 Stručný popis............................................. 3 1.2 ER diagram.............................................. 3 1.3 Integritní omezení......................................... 4 2 Realizace databáze............................................. 4 2.1 Uživatelský datový typ..................................... 4 2.2 Relace................................................... 4 2.3 SQL..................................................... 4 2.4 Funkce................................................... 5 2.5 Data..................................................... 5 3 Realizace programu............................................ 5 3.1 Úprava vygenerovaného kódu............................... 5 4 Dotazy....................................................... 5 4.1 Měřené charakteristiky..................................... 7 4.2 Dotazy s příkazem EXPLAIN............................... 8 4.3 Indexy a příkaz EXPLAIN................................. 8 5 Přílohy....................................................... 11 5.1 SQL skript............................................... 11 6 Použité zdroje................................................. 14

Tabulka fotbalové ligy a tabulka střelců 3 1 Zadání 1.1 Stručný popis Cílem je vytvoření fotbalové tabulky střelců a pořadí týmů podle bodů vztahující se k daným soutěžím. Evidují se registrované osoby federace a ty jsou rozděleny do družstev. Registrovaná osoba obsahuje jméno a příjmení a může jí být: Trenér - u nějž se eviduje stupeň získané licence Hráč - u nějž se eviduje, jakou nohu preferuje (pravá, levá) a samozřejmě branky, které vstřelil Kapitán specializace hráče, řídí tým na hřišti, obsahuje stupeň respektu a rovněž vstřelené branky Každý evidovaný zápas obsahuje dva týmy (domácí, hosté) hrající utkání, dále místo, kde se utkání odehraje a soutěž, do které utkání spadá. Zároveň je potřeba zápasy a vstřelené branky archivovat podle sezón. To lze zařídit tak, že každé soutěži přiřadíme sezónu, ve které probíhá. 1.2 ER diagram Jako modelovací nástroj pro Entitně-Relační model, jsme využili DbDesigner (MySQL WorkBench 5.0.x). E-R model modeluje situaci uvedenou v sekci Popis a nachází se v 3NF. Obrázek 1. ER diagram

4 Tabulka fotbalové ligy a tabulka střelců 1.3 Integritní omezení V tabulce player evidujeme hráčovu lepší nohu, tento atribut může obsahovat pouze slova levá a pravá. U kapitána evidujeme jeho respekt vůči hráčům. Tato hodnota nabývá hodnot 1-10. 2 Realizace databáze Pro účely této semestrální práce jsme si nejprve založili verzovací systém SVN, který je dostupný z URL http://xp-dev.com/svn/db2project/. Naše databáze bude fyzicky uložena na databázovém stroji PostgreSQL, konkrétně ve verzi 9.1. Veškeré níže uvedené SQL příkazy jsou tedy syntakticky určené právě pro tento stroj. 2.1 Uživatelský datový typ V tabulkách place a person evidujeme adresu (ulice, město, stát), pro jejíž uložení jsme si definovali svůj datový typ vytvořený následovně: CREATE TYPE address AS ( street VARCHAR(255), city VARCHAR(255), country VARCHAR(255) 2.2 Relace TEAM( idteam, name ) PLACE( idplace, place address, map url ) SEASON( idseason, year from, year to ) LEAGUE ( idleague, season idseason, name ) MATCH ( idmatch, home idteam, away idteam, place idplace, league idleague, season idseason, name ) PERSON ( idperson, firstname, lastname, team id team, person address ) PLAYER ( idplayer, idperson, prefered leg ) COACH ( idcoach, idperson, licence level ) CAPTAIN ( idcaptain, idplayer, idperson, respect ) GOAL ( idgoal, match idmatch, player idplayer ) 2.3 SQL Všechny SQL příkazy pro vytvoření jednotlivých tabulek jsou uvedeny v příloze 5.1. Tato sada SQL příkazů je plně funkční, pro vytvoření kompletní databáze ji tedy můžeme rovnou použít.

Tabulka fotbalové ligy a tabulka střelců 5 2.4 Funkce V databázi jsme si definovali funkci, která nám pro zadání jména klubu vrátí počet hráčů, kteří v klubu hrají. Zdrojový kód funkce vypadá následovně: CREATE FUNCTION GET_COUNT_OF_PLAYERS (CLUB_NAME VARCHAR(100)) RETURNS INT AS $$ DECLARE count_of_players INT; BEGIN SELECT COUNT(*) INTO count_of_players FROM TEAM t JOIN PERSON p ON t.idteam = p.team_idteam WHERE t.name = $1 ; RETURN count_of_players; END; $$ LANGUAGE plpgsql; 2.5 Data Pro naplnění databáze daty jsme si vytvořili vlastní generátor, který nám vygeneruje např. jednotlivé fotbalové týmy, kterých máme 1200. Program generuje data ve formátu sekvence SQL příkazů Insert. 3 Realizace programu Vytvořený program demonstrující komunikaci s databází je napsán v jazyce Java. Pro ORM jsme použili technologii JPA 2.0, konkrétně implementaci EclipseLink. Za použití vývojového prostřední NetBeans se nám vytvořily oanotované třídy reprezentující relace v databázi. 3.1 Úprava vygenerovaného kódu Vygenerovaný kód nebyl zcela optimální a přehledný, a tak jsme jej dále modifikovali. Konkrétně jsme v odpovídajících třídách upravili dědičnost (podle strategie InheritanceType.JOINED) a uživatelský datový typ (adresu) jsme defiovali jako @Embededded, respektive přímo tuto třídu jsme opatřili anotací @Embeddable. Databázi jsme poté znovu přegenerovali podle nově upraveného kódu v Javě. Dále jsme do třídy Person přidali jeden atribut, před který jsme přidali anotaci @Version. Atribut slouží ke kontrole editovaných verzí, které probíhá při použití optimistického zamykání během operace UPDATE. 4 Dotazy Dalším našim úkolem bylo vymyslet několik složitých dotazů, které budeme později optimalizovat. Vytvořili jsme 3 dotazy, přičemž jsme se snažili, aby se tabulky musely co nejvíc spojovat a bylo dáno co nejvíce omezení.

6 Tabulka fotbalové ligy a tabulka střelců 1. Vyber a seřad všechny albánské týmy podle počtu vstřelených branek v sezoně 2011/2012. SELECT t."name" AS "teamname", count(t."name") AS "goalcount" FROM goal g JOIN "match" m ON m.idmatch = g.match_idmatch JOIN league l ON m.league_idleague = l.idleague JOIN season s ON s.idseason = l.season_idseason JOIN person p ON p.idperson = g.player_idplayer JOIN team t ON t.idteam = p.team_idteam WHERE l."name" = Albania AND s.year_from = 2011 GROUP BY t."name" ORDER BY count(t."name" 2. Vypiš jméno a příjmení kapitána, který dal v během jedné sezony ve více než jednom zápase 3 a více gólů. SELECT p.lastname, p.firstname FROM captain c JOIN person p ON p.idperson = c.idperson JOIN goal g ON g.player_idplayer = c.idperson JOIN "match" m ON m.idmatch = g.match_idmatch JOIN league l ON l.idleague = m.league_idleague JOIN season s ON s.idseason = l.season_idseason WHERE (p.team_idteam = m.home_idteam OR p.team_idteam = m.away_idteam) AND (s.year_from = 2000) GROUP BY p.idperson HAVING count(g.idgoal) > 2 AND count(m.idmatch) > 1; 3. Vyber tým, který hraje v lize Primera División a jehož kapitán má nejvyšší respekt od spoluhřáčů a současně je to levák. SELECT t FROM Person p JOIN Player pl ON p.idperson = pl.idperson JOIN Captain c ON p.idperson = c.idperson JOIN Team t ON t.idteam = p.team_idteam JOIN Goal g ON g.player_idplayer = p.idperson JOIN "match" m ON m.idmatch = g.match_idmatch JOIN League l ON l.idleague = m.league_idleague WHERE c.respect = (

Tabulka fotbalové ligy a tabulka střelců 7 SELECT MAX(respect) FROM captain ) AND pl.prefered_leg = leva AND l."name" = Primera División ; 4.1 Měřené charakteristiky Pro určení některých charakteristik jsme si museli zjistit nebo odhadnout některé údaje, které jsme v našich výpočtech dále používali. Šlo o velikost databázového bloku a velikost hlavičky DB bloku. velikost DB bloku = 8 kb = 8192 B hlavička DB bloku = 500 B Dalším parametrem, kterým jsme museli pro každou tabulku odhadnout je parametr plnění bloku P CT F REE, který závisí na variabilitě délky n-tice dané tabulky. Některé databázové stroje (např. Oracle) přímo poskytuje příkaz SE- LECT PCTFREE... Záleží tedy především na délce atributů typu V ARCHAR. Délka atributů datových typů např. IN T se samozřejmě nemění. Pokud tedy má některá tabulka pouze atributy typu INT a jsou tyto atributy povinné, pak P CT F REE = 0. Některé charakteristiky (blokovací faktor, počet stránek potřebných pro načtení) jsme museli na základě ostatních dopočítat. Zde uvádíme jejich vzorečky: B r = P r = N r /B r DB BLOCK SIZE HEADER SIZE ROW SIZE AV G (1 P CT F REE) Data jsou v bloku ukládána vždy tak, že na prvním místě je identifikátor řádky (1B), následuje délka atributu (1B) a data atributu. Tabulka N r ROW SIZE AV G B r P r P CT F REE Team 1073 27 228 4,7 20% Person 7200 75 51,3 140 50% Match 40390 35 220 184 0% Goal 66584 16 481 138 0% League 8078 32 48 168 80% Tabulka 1. Charakteristiky vybraných tabulek

8 Tabulka fotbalové ligy a tabulka střelců 4.2 Dotazy s příkazem EXPLAIN Analyzovali jsme naše 3 dotazy pomocí příkazu EXPLAIN, který zobrazí execution plan každého z nich. Zároveň jsme je spouštěli s příkazem ANALYZE, který jednotlivé části execution plánu provádí a vrátí jejich čas provedení i celkový čas provedení. Protože výstupy jsou poměrně rozsáhlé, vložili jsme je do přiloženého souboru explain.sql. 4.3 Indexy a příkaz EXPLAIN Po analýze pomocí příkazu EXPLAIN popsané v předchozí sekci č. 4.2, jsme se pustili do optimalizace těchto dotazů. Optimalizovali jsme spotřebované zdroje (cenu) a čas, za které dotaz proběhl. Jako dotazy jsme použili naše 3 složité dotazy. Pro optimalizaci jsme zvolili vytvoření INDEXů pro potřebné sloupce. Podrobné rozbory dotazů, časy a ceny jsou v souborech explain.x.query.txt, kde X je cislo dotazu {1..3}. Před spuštěním dotazů jsme v konfiguračním souboru PostgreSQL zakomentovali metody pro optimalizaci dotazu. Konkrétně parametry pro Planner Method Configuration, Planner Cost Constants, Genetic Query Optimizer a ostatní plánovací konstanty. Bohužel se nám dotazy příliš vylepšit nepodařilo. Zapnut je možná nějaký interní optimalizátor, který nejde vypnout(alespoň po hodinách hledání sme nic nenalezli). První dotaz vybere a seřadí všechny albánské týmy podle počtu vstřelených branek v sezóně 2011/2012. Pracuje se tedy hojně s tabulkou Team a sloupcem Name. Podle sloupce Name tabulky Team se dotaz sortuje, grupuje a figuruje i v podmince WHERE. Použili jsme tedy INDEX na tento sloupec. Dále sme zvolili index na sloupec YearsFrom tabulky Goal, který figuruje v podmínce dotazu. Velkou část dotazu představuje JOIN tabulek a agregační funkce count nad sloupcem Name tabulky Team. Indexy nad agregačními funkcemi nejsou povoleny a jako sortovací algoritmus byl zvolen quicksort. Zde se tedy moc optimalizovat nedalo. Na zkoušku sme zkusili i nějaké INDEXy nad primárními a cizími klíči tabulek, jež se nalézají v JOINech. Před použitím indexů se dotaz provedl v čase 20.1 ms. Po použití indexů se průměrně provádí v čase 16-17 ms. Použité indexy: CREATE INDEX league_idx ON league (idleague, name, season_idseason CREATE INDEX team_idx ON team (idteam, name CREATE INDEX season_idx ON season (idseason, year_from CREATE INDEX match_idx ON match (idmatch, league_idleague CREATE INDEX goals_idx ON goal (idgoal, match_idmatch, player_idplayer Naměřené hodnoty po provedení příkazu EXPLAIN prvního dotazu, jsou uvedeny níže.

Tabulka fotbalové ligy a tabulka střelců 9 Operace Cena Čas Sort 1507.08 19.990 HashAggregate 1507.04 19.978 Nested Loop 1507.00 19.958 Nested Loop 1506.13 19.899 Nested Loop 1505.27 19.822 Nested Loop 503.60 4.146 Nested Loop 151.75 1.919 Tabulka 2. Tabulka cen a časů prvního dotazu před optimalizací Operace Cena Čas Sort 1479.62 18.219 HashAggregate 1479.59 18.209 Nested Loop 1479.55 18.189 Nested Loop 1478.68 18.132 Nested Loop 1477.81 18.067 Nested Loop 476.17 3.415 Nested Loop 151.75 1.738 Tabulka 3. Tabulka cen a časů prvního dotazu po optimalizaci Druhý dotaz vrací jméno a příjmení kapitána družstva, jež dal během jedné sezóny (2010/2011) více jak 3 branky ve více než 1 zápase. Výsledek je tedy projekce sloupců jména a příjmení tabulky Person. Na tyto sloupce jsme tedy použili INDEXy. Dotaz opět používá agragační funkce, zkusili jsme ale zda použití unikátního INDEXu na ID tabulky PERSON zlepší průběh provádění dotazu. Nesmíme zapomenout, že INDEXy vytvořené při prvním dotazu, platí i pro druhý dotaz. Před použitím indexů se dotaz provedl v čase 48.9 ms. Po použití indexů se průměrně provádí v čase 35-37 ms. Použité indexy: -- + INDEXy z 1. dotazu CREATE INDEX person_idx ON person (lastname, firstname CREATE UNIQUE INDEX person_uniq_idx ON person (idperson Naměřené hodnoty po provedení příkazu EXPLAIN druhého dotazu, jsou uvedeny níže. Třetí dotaz vrací tým, který hraje v Primera División a jehož kapitán má u svých spoluhráčů nejvyšší respekt (jako kapitán je nejlepší) a navíc je to levák. V tomto dotazu (kromě JOINů) filtrujeme data podle jména ligy, podle respektu kapitána a velkou roli zde hraje atributy tabulky Player - konkrétně atributy prefered leg a cizí klíč idperson. Na základě těchto informací jsme volili použití indexů. Definovali jsme následující indexy: CREATE INDEX player_idx ON player (idperson, prefered_leg

10 Tabulka fotbalové ligy a tabulka střelců Operace Cena Čas HashAggregate 2334.83 48.669 Nested Loop 2334.81 48.169 Hash Join 2272.20 46.221 Hash Join 2236.56 45.167 Hash Join 940.27 18.146 Hash Join 162.29 2.711 Tabulka 4. Tabulka cen a časů druhého dotazu před optimalizací Operace Cena Čas HashAggregate 2334.83 35.044 Nested Loop 2334.81 34.778 Hash Join 2272.20 33.733 Hash Join 2236.56 32.896 Hash Join 940.27 17.902 Hash Join 162.29 2.704 Tabulka 5. Tabulka cen a časů druhého dotazu po optimalizaci CREATE INDEX captain_idx ON captain (idperson, respect CREATE INDEX league_idx ON league (idleague, name CREATE INDEX match_idx ON match (idmatch, league_idleague CREATE INDEX goals_idx ON goal (player_idplayer Naměřené hodnoty po provedení příkazu EXPLAIN třetího dotazu, jsou uvedeny níže. Operace Cena Čas Nested Loop 1730.06 88.576 Nested Loop 1709.31 88.293 Nested Loop 1602.11 71.253 Nested Loop 1484.82 59.400 Hash Join 335.79 52.767 Hash Join 139.76 19.785 Tabulka 6. Tabulka cen a časů třetího dotazu před optimalizací Díky těmto indexům se snížila cena i průměrný čas provádění tohoto dotazu (při 10-ti spuštění) z 89ms na 77ms.

Tabulka fotbalové ligy a tabulka střelců 11 Operace Cena Čas Nested Loop 1719.38 133.084 Nested Loop 1698.63 132.750 Nested Loop 1591.53 111.552 Nested Loop 1480.60 91.231 Hash Join 335.79 80.798 Hash Join 139.76 17.228 Tabulka 7. Tabulka cen a časů třetího dotazu po optimalizaci 5 Přílohy 5.1 SQL skript CREATE TYPE address AS ( street VARCHAR(255), city VARCHAR(255), country VARCHAR(255) CREATE TABLE team ( idteam SERIAL NOT NULL PRIMARY KEY, name VARCHAR(100) NOT NULL CREATE TABLE place ( idplace SERIAL NOT NULL PRIMARY KEY, place_address address, map_url TEXT NULL CREATE TABLE season ( idseason SERIAL NOT NULL year_from INT NOT NULL, year_to INT NOT NULL PRIMARY KEY, CREATE TABLE league ( idleague SERIAL NOT NULL UNIQUE, season_idseason INT NOT NULL, name VARCHAR(255) NOT NULL, PRIMARY KEY (idleague, season_idseason), CONSTRAINT fk_league_season FOREIGN KEY (season_idseason ) REFERENCES season (idseason )

12 Tabulka fotbalové ligy a tabulka střelců ON UPDATE NO ACTION CREATE TABLE match ( idmatch SERIAL NOT NULL UNIQUE, home_idteam INT NOT NULL, away_idteam INT NOT NULL, place_idplace INT NOT NULL, league_idleague INT NOT NULL, time TIMESTAMP NOT NULL, PRIMARY KEY (idmatch, home_idteam, away_idteam, place_idplace, league_idleague), CONSTRAINT fk_match_team FOREIGN KEY (home_idteam ) REFERENCES team (idteam ) ON UPDATE NO ACTION, CONSTRAINT fk_match_team1 FOREIGN KEY (away_idteam ) REFERENCES team (idteam ) ON UPDATE NO ACTION, CONSTRAINT fk_match_place FOREIGN KEY (place_idplace ) REFERENCES place (idplace ) ON UPDATE NO ACTION, CONSTRAINT fk_match_league FOREIGN KEY (league_idleague ) REFERENCES league (idleague ) ON UPDATE NO ACTION CREATE TABLE person ( idperson SERIAL NOT NULL PRIMARY KEY, firstname VARCHAR(150) NOT NULL, lastname VARCHAR(100) NOT NULL, team_idteam INT NOT NULL, person_address address NOT NULL, CONSTRAINT fk_person_team FOREIGN KEY (team_idteam ) REFERENCES team (idteam ) ON UPDATE NO ACTION

Tabulka fotbalové ligy a tabulka střelců 13 CREATE TABLE player ( idplayer SERIAL NOT NULL PRIMARY KEY, prefered_leg VARCHAR(10) NOT NULL, CONSTRAINT player_isa FOREIGN KEY (idplayer) REFERENCES person(idperson), CONSTRAINT pref_leg CHECK (prefered_leg = levá OR prefered_leg = pravá ) CREATE TABLE coach ( idcoach SERIAL NOT NULL PRIMARY KEY, licence_level INT NOT NULL, CONSTRAINT coach_isa FOREIGN KEY (idcoach) REFERENCES person(idperson) CREATE TABLE captain ( idcaptain SERIAL NOT NULL PRIMARY KEY, respect INT NOT NULL, CONSTRAINT captain_isa FOREIGN KEY (idcaptain) REFERENCES player(idplayer), CONSTRAINT respect_constraint CHECK (respect > 0 AND respect < 11) CREATE TABLE goal ( idgoal SERIAL NOT NULL, match_idmatch INT NOT NULL, player_idplayer INT NOT NULL, PRIMARY KEY (idgoal, match_idmatch, player_idplayer), CONSTRAINT fk_goal_match FOREIGN KEY (match_idmatch ) REFERENCES match (idmatch ) ON UPDATE NO ACTION, CONSTRAINT fk_goal_player FOREIGN KEY (player_idplayer ) REFERENCES player (idplayer ) ON UPDATE NO ACTION

14 Tabulka fotbalové ligy a tabulka střelců 6 Použité zdroje Reference [1] Pokorný, Halaška, Databázové systémy. skripta FEL ČVUT, 2. vydání, 2003. [2] PostgreSQL manual http://www.postgresql.org/docs/8.0/static/tutorial.html. online, 8.12.2011. [3] JPA tutoriál http://docs.oracle.com/javaee/6/tutorial/doc/bnbpz.html. online, 8.12.2011.