Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Databázové Aplikace Slidy k přednášce NDBI026 KSI MFF UK Verze 13.10.02.12.00.

Podobné prezentace


Prezentace na téma: "Databázové Aplikace Slidy k přednášce NDBI026 KSI MFF UK Verze 13.10.02.12.00."— Transkript prezentace:

1 Databázové Aplikace Slidy k přednášce NDBI026 KSI MFF UK Verze

2 DBI026 -DB Aplikace - MFF UK Literatura Manuálové stránky Oracle 11g –Dostupné odkudkoli –Dostupné z domény.mff.cuni.cz intra/oracle/doc/ora1120doc/ –Dostupné odkudkoli

3 DBI026 -DB Aplikace - MFF UK Literatura, pokrač. Manuálové stránky MS SQL –Dostupné odkudkoli en-us/library/bb aspx

4 DBI026 -DB Aplikace - MFF UK Literatura, pokrač. D. Quass, J. Widom. R. Goldman, K. Haas, Q. Luo, J. McHugh, S. Nestorov, A. Rajaraman, H. Rivero, S. Abiteboul, J. Ullman, and J. Wiener: LORE: A Lightweight Object REpository for Semistructured Data, Roy Goldman, Jennifer Widom: DataGuides: Enabling Query Formulation and Optimalization in Semistructured Databases,

5 DBI026 -DB Aplikace - MFF UK O čem to bude? Předpoklady –Databázové systémy Základy SQL –SELECT příkazy Návrh schémat –Normální formy Vlastnosti transakcí, serializovatelnost, Co se dozvím –Praktický návrh aplikací –Na co si dát pozor Při vytváření relačních schémat Při psaní SQL příkazů –Optimalizace odezvy –Indexy –Plány provádění Ve víceuživatelském provozu –Zamykání –Transakční zpracování Zabezpečení dat Přednáška č. 1

6 DBI026 -DB Aplikace - MFF UK Co zde bude Relační model –dosud nejrozšířenější a nejpoužívanější Optimalizace dotazů –volba indexů a vhodné formulace dotazu může ovlivnit výsledný čas provádění dotazu i o několik řádů Víceuživatelský provoz –nevhodně navržená aplikace může způsobovat nekorektní průběh datových manipulací a neočekávané výsledky

7 DBI026 -DB Aplikace - MFF UK Co zde bude, pokrač. Procedurální rozšíření –Triggery pro hlídání korektnosti aktualizací –Uložené procedury a funkce Objektové rozšíření –Uživatelské datové typy –Hnízděné tabulky –…

8 DBI026 -DB Aplikace - MFF UK Na čem se cvičí? DB systém Oracle 11g –Objektově relační databáze –Podpora provádění kódu v jazycích PL/SQL Java C/C++ (obecně jakákoli.dll/.so knihovna) –Podpora XML, multimédií a dalších rysů DB MS SQL 2008 R2 –Objektově relační databáze –Podpora provádění kódu v jazycích T-SQL C# –Podpora XML, textu a dalších rysů

9 DBI026 -DB Aplikace - MFF UK Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním SQL-78 SQL-92 ANSI/SQL2;ISO/IEC 9075:1992 –Entry, –Intermediate, –Full SQL-99 ANSI/ISO/IEC 9075:1999 SQL-2003 ISO/IEC 9075:2003 …

10 DBI026 -DB Aplikace - MFF UK Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním Jednotlivé databázové servery ne vždy dodržují ANSI normu –Obvykle pouze SQL-92 Entry –Řada nepřenositelných rozšíření navíc –Ne všechny rysy implementovány dle ANSI S novými verzemi se kompatibilita zlepšuje Často nyní existují obě syntaxe zároveň Běžný SQL-92 kompatibilní server

11 DBI026 -DB Aplikace - MFF UK Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním Čím více se při vývoji aplikace využijí rysy vyšší než SQL-92 Entry –Tím menší je šance, že aplikace bude provozuschopná i na jiné databázi Části vyšších verzí jsou často řešeny pouze proprietárně a nepřenositelně Před začátkem vývoje je proto obvykle nutné zvolit cílovou platformu Její změna v prostředku vývoje nebo po nasazení aplikace je velmi drahá Běžný SQL-92 kompatibilní server

12 DBI026 -DB Aplikace - MFF UK Problémy ANSI/ISO norem SQL s jejich (ne)dodržováním Co v případě, že server nechce SQL příkaz přijmout? –Je příkaz nekorektní, nebo server normu nepodporuje? –Validátory SQL

13 Úvod do SQL SELECT příkaz Vestavěné funkce a operátory

14 DBI026 -DB Aplikace - MFF UK SELECT příkaz SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]]

15 DBI026 -DB Aplikace - MFF UK SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu) SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Nejprve se zkombinují data ze všech zdrojů (tabulek, pohledů, poddotazů) Pokud jsou odděleny čárkami, provede se kartézský součin ANSI SQL-92 zavádí spojení JOIN ON, NATURAL JOIN, OUTER JOIN, …

16 DBI026 -DB Aplikace - MFF UK SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu) SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vyřadí se vzniklé řádky, které nevyhovují podmínce

17 DBI026 -DB Aplikace - MFF UK SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu) SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Zbylé řádky se seskupí do skupin se stejnými hodnotami uvedených výrazů (SORT/HASH) Každá skupina obsahuje atomické sloupce s hodnotami uvedených výrazů a množinové sloupce se skupinami ostatních hodnot sloupců

18 DBI026 -DB Aplikace - MFF UK SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu) SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vyřadí se skupiny, nevyhovující podmínce

19 DBI026 -DB Aplikace - MFF UK SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu) SELECT [DISTINCT] výraz1 [[AS] c_alias1] [, …] FROM zdroj1 [[AS] t_alias1] [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Výsledky se setřídí podle požadavků

20 DBI026 -DB Aplikace - MFF UK SELECT příkaz - logické vykonání (bez uvažování optimalizace dotazu) SELECT [DISTINCT] výraz [[AS] alias] [, …] FROM zdroj1 t_alias1 [, …] [WHERE podmínka_ř] [GROUP BY výraz_g1 [, …] [HAVING podmínka_s]] [ORDER BY výraz_o1 [, …]] Vygeneruje se výstup s požadovanými hodnotami V případě DISTINCT se vyřadí duplicity (SORT/HASH)

21 DBI026 -DB Aplikace - MFF UK Co hlídat při psaní SELECT příkazu Klauzule GROUP BY setřídí před vytvořením skupin všechny řádky dle výrazů v klauzuli, v lepším případě nejdříve řádky podle hash hodnoty výrazů rozdělí do menších přihrádek –Seskupovat by se měl co nejmenší možný počet řádek –Pokud je možné řádky odfiltrovat pomocí WHERE, je výsledek efektivnější, než následné odstraňování celých skupin

22 DBI026 -DB Aplikace - MFF UK Co hlídat při psaní SELECT příkazu SELECT Ulice, COUNT(*) FROM Obyvatel WHERE Mesto='Brno' GROUP BY Mesto, Ulice; Setřídí se jen 370 tis. záznamů obyvatel Brna  SELECT Ulice, COUNT(*) FROM Obyvatel GROUP BY Mesto, Ulice HAVING Mesto='Brno'; Všech 10mil. záznamů se setřídí (zahešuje), ponechají se jen skupiny z Brna

23 DBI026 -DB Aplikace - MFF UK Co hlídat při psaní SELECT příkazu Klauzule DISTINCT třídí (hešuje) výsledné záznamy (ještě před operací ORDER BY), aby našla duplicitní záznamy –Pokud to jde, je vhodné se bez DISTINCT obejít Klauzule ORDER BY by měla být použita, jen v nutných případech –Není příliš vhodné ji používat v definicích pohledů, nad kterými se dále dělají další dotazy

24 Přehled software pro cvičení

25 DBI026 -DB Aplikace - MFF UK MFF Linux Server tirpitz.ms.mff.cuni.cz –Databáze jedenact (11.x) –Klienti Linux Laboratoř UW1, UW2 –SQL Developer Laboratoř US1, US2 (u-pl*.ms.mff…) –SQL Developer jedenact tirpitz.ms.mff… UW1,2u-pl*.ms.mff… TCP/IP

26 DBI026 -DB Aplikace - MFF UK MS MFF Laboratoř UW1, UW2 –Klienti Win32 –MS SQL Server 2008 UW1,2

27 Relační model SQL Vytváření tabulek a pohledů Integritní omezení Aktualizace dat

28 DBI026 -DB Aplikace - MFF UK Vytváření tabulek CREATE TABLE jm_tab ( jm_sloupce typ [(velikost)] [omezení], …, omezení_řádky, … ); CREATE TABLE Osoba ( rc character(11) CONSTRAINT Osoba_PK PRIMARY KEY, jmeno character(50) NOT NULL );

29 DBI026 -DB Aplikace - MFF UK Reprezentace textových dat –SQL-92 rozlišuje dvoje kódování znaků Důvodem je podpora UTF-8 (UTF-16) –Možnost ukládání znaků libovolného jazyka –Neefektivní vícebajtová reprezentace znaků pro znaky národních abeced 1.Globální znaková sada, –UTF (ne nutně) 2.Národní znaková sada pro texty v jednom konkrétním jazyce - českém, slovenském, … –CP-1250, ISO , …

30 DBI026 -DB Aplikace - MFF UK Reprezentace textových dat –SQL-92 dále rozlišuje dvojí reprezentaci řetězců 1.Pevná délka, zprava doplněno mezerami –Snadnější aktualizace dat –Méně efektivní reprezentace 2.Proměnná délka, ukládají se použité znaky plus délka řetězce –Efektivnější reprezentace –Komplikovanější aktualizace, nová hodnota může zabrat jiný počet bajtů

31 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 1) Textové –CHARACTER(n) text v pevné délce n znaků CHARACTER VARYING(n) CHAR VARYING(n) text v proměnné délce max. n znaků –NATIONAL CHARACTER(n) text v pevné délce n znaků v národní abecedě NATIONAL CHARACTER VARYING(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) text v proměnné délce max. n znaků v národní abecedě

32 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 1) Textové Konstanty se uzavírají do apostrofů Apostrof se v konstantách zdvojuje

33 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 2) Číselné –NUMERIC(p[,s]) obecný číselný typ na p platných míst, s cifer za desetinnou čárkou INTEGER, INT, SMALLINT celé číslo FLOAT(b) reálné číslo v b-bitové přesnosti reprezentace REAL reálné číslo DOUBLE PRECISION reálné číslo ve dvojnásobné přesnosti

34 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 3) Datumové –DATE datum (YYYY-MM-DD ) s přesností na dny TIME čas (HH:MM.SS.MMMM) s přesností minimálně na sekundy TIMESTAMP datum plus čas (YYYY-MM-DD HH:MM.SS.MMMM) TIME[STAMP](p) WITH TIMEZONE p udává přesnost sekund, čásová zóna se udává na konci ve tvaru +HH:MM, resp. –HH:MM

35 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 3) Datumové Konstanty se uzavírají do apostrofů v uvedeném formátu

36 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 vs. reálná DB Databázové servery –Ne vždy podporují všechny uvedené typy –Nemusí tyto typy podporovat nativně, pouze si „přeloží“ název typu na podobný nativně podporovaný typ

37 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 vs. Oracle SQL CHARACTER(n) CHARACTER VARYING(n) CHAR VARYING(n) NATIONAL CHARACTER(n) NATIONAL CHARACTER VARYING(n) NATIONAL CHAR VARYING(n) NCHAR VARYING(n) NUMERIC(p,s) INTEGER, INT, SMALLINT FLOAT(b) DOUBLE PRECISION REAL CHAR(n) VARCHAR2(n) NCHAR(n) NVARCHAR2(n) NVARCHAR2(n) NVARCHAR2(n) NUMBER(p,s) NUMBER(38) NUMBER NUMBER NUMBER

38 DBI026 -DB Aplikace - MFF UK Datové typy dle ANSI SQL-92 vs. Oracle SQL DATE –Přesnost ukládání na sekundy, tj. splňuje požadavky SQL-92 na TIMESTAMP –Základní (americký) formát DD-MON-YY např. 01-JAN-2006 VARCHAR2(velikost), //doporučeno VARCHAR(velikost) –Řetězec s proměnlivou délkou velikost max znaků (dop. max znaků)

39 DBI026 -DB Aplikace - MFF UK Integritní omezení [CONSTRAINT jméno] definice_omezení [INITIALLY {DEFERRED|IMMEDIATE}] [[NOT] DEFERRABLE] –Pokud omezení není pojmenované, dostane obvykle nic neříkající jméno (V Oracle např. SYS_Cnnnnnn). –Doporučuje se proto omezení pojmenovávat Jednotlivá sloupcová omezení se od sebe oddělují mezerou

40 DBI026 -DB Aplikace - MFF UK Integritní omezení NULL, resp. NOT NULL –Sloupec může, resp. nemůže mít nedefinovanou hodnotu NULL. UNIQUE –Sloupec musí mít všechny hodnoty různé. –Obvykle se používá volnější interpretace: Sloupec musí mít všechny definované hodnoty různé. PRIMARY KEY –Sloupec tvoří primární klíč tabulky, je automaticky chápán jako NOT NULL a UNIQUE.

41 DBI026 -DB Aplikace - MFF UK Integritní omezení CHECK (podmínka) –Hodnota sloupce musí splňovat podmínku. REFERENCES tabulka(sloupec) [ON DELETE {CASCADE|SET NULL}] –Hodnota odkazuje na primární klíč, nebo kandidátní klíč (UNIQUE sloupec) uvedené tabulky –S klauzulí ON DELETE je povoleno mazání nadřízené řádky. Pokud je smazána, podřízená řádka je smazána rovněž, nebo je je hodnota ve sloupci nastavena na NULL

42 DBI026 -DB Aplikace - MFF UK Integritní omezení DEFAULT hodnota –Defaultní hodnota, pokud není uvedeno jinak –Standardně je DEFAULT NULL

43 DBI026 -DB Aplikace - MFF UK Integritní omezení Příklad –CREATE TABLE Osoba( RC CHARACTER(11) CONSTRAINT Osoba_PK PRIMARY KEY, JMENO CHAR VARYING(30) CONSTRAINT Osoba_U_Jmeno UNIQUE NOT NULL, CHAR VARYING(30) CONSTRAINT Osoba_C_ CHECK ( LIKE ' ' );

44 DBI026 -DB Aplikace - MFF UK Datový slovník v Oracle / MS SQL Informace o tabulkách jsou v Oracle uloženy v pohledech –USER_TABLES –USER_TAB_COLUMNS –USER_CONSTRAINTS Informace o tabulkách jsou v MS SQL uloženy v pohledech –INFORMATION_SCHEMA.TABLES –INFORMATION_SCHEMA.COLUMNS –INFORMATION_SCHEMA.TABLE_CONSTRAINTS

45 DBI026 -DB Aplikace - MFF UK Řádková integritní omezení Mohou kontrolovat vzájemný vztah více sloupců jednoho řádku –CHECK (zacatek <= konec) Mohou definovat vícesloupcové primární a kandidátní a cizí klíče –PRIMARY KEY (zacatek, konec) –FOREIGN KEY (zacatek, konec) REFERENCES Rodic (x, y)

46 DBI026 -DB Aplikace - MFF UK Atributy integritních omezení ENABLED / DISABLED –Omezení je aktivní a platnost se ověřuje ALTER TABLE tabulka {ENABLE|DISABLE} CONSTRAINT omezení; DEFERRED / IMMEDIATE –Ověření se odloží na konec transakce, jinak se ověřuje okamžitě DEFERRABLE / NOT DEFERRABLE –Ověření je / není možné odkládat na konec transakce

47 DBI026 -DB Aplikace - MFF UK Na co si dát při návrhu pozor Hlídat na úrovni databáze všechny manipulace s daty, které ohlídat jdou –Cokoli jde zadat uživatelem špatně, bude zadáno špatně Integritní omezení, triggery –Později je čištění nekonzistentních dat namáhavé a opravy často nemožné –Lépe ohlídat vše centrálně, než v každé aplikaci zvlášť

48 DBI026 -DB Aplikace - MFF UK Na co si dát při návrhu pozor Hlídat unikátnost vkládaných dat –Každá tabulka by měla mít primární klíč –I v případě, kdy je primární klíč uměle vytvořený, jednotlivé instance (řádky) obvykle mívají svůj přirozený jedno- či vícesloupcový identifikátor, který by měl být definován jako alternativní klíč tabulky (UNIQUE) –Nezřídka existuje více alternativních klíčů

49 #INCLUDE dbacv_01.ppt INSERT/UPDATE/DELETE Vestavěné funkce

50 Změna schématu aplikace Přidávání a odebírání sloupců a omezení Změna definice sloupců a omezení Přednáška č. 2

51 DBI026 -DB Aplikace - MFF UK Proč měnit schéma aplikace Chyba v návrhu –Špatná normální forma aplikace –Nelze uložit všechna požadovaná data –Chybně definovaná kontrola Změna požadavků ze strany zákazníka –Podpora nových vlastností evidovaných entit –Změna v omezeních –…

52 DBI026 -DB Aplikace - MFF UK Na co při změnách schématu nezapomenout Změny schématu a aplikace představují obvykle výraznou většinu životního cyklu aplikace Data evidovaná ve schématu mají větší cenu, než použitý software a hardware Schopnost změny schématu aplikace a modifikace dat bez jejich ztráty je důležitější, než vytváření schématu zcela nového

53 DBI026 -DB Aplikace - MFF UK Změna definic tabulek Přidání sloupce do již existujících tabulek ALTER TABLE tabulka ADD definice sloupce; Př. ALTER TABLE Osoba ADD Poznamka CHARACTER VARYING(1000); ALTER TABLE Vyrobek ADD EAN NUMERIC(13) CONSTRAINT Vyrobek_U_EAN UNIQUE;

54 DBI026 -DB Aplikace - MFF UK Změna definic tabulek Zrušení sloupce v již existující tabulce –Před zrušením je obvykle nutné data přesunout na nové místo! ALTER TABLE tabulka DROP COLUMN sloupec; Př. ALTER TABLE Osoba DROP COLUMN Psc;

55 DBI026 -DB Aplikace - MFF UK Změna definic tabulek Přidání omezení do již existujících tabulek ALTER TABLE tabulka ADD definice omezení; Př. ALTER TABLE Osoba ADD CONSTRAINT Osoba_FK_Matka FOREIGN KEY(matka) REFERENCES Osoba(ID) ON DELETE SET NULL;

56 DBI026 -DB Aplikace - MFF UK Změna definic Zrušení nadbytečného omezení v tabulce ALTER TABLE tabulka DROP CONSTRAINT omezení; Př. ALTER TABLE Osoba DROP CONSTRAINT Osoba_U_Jmeno;

57 DBI026 -DB Aplikace - MFF UK Změna definic tabulek Sloupce a omezení lze přidávat najednou příkazem ALTER TABLE tabulka ADD ( definice sloupce | omezení, … ); Př. ALTER TABLE Osoba ADD ( Poznamka CHARACTER VARYING(1000), CONSTRAINT Osoba_Chk_Vek CHECK (Vek>=0) );

58 DBI026 -DB Aplikace - MFF UK Změna definic tabulek Sloupce lze redefinovat příkazem ALTER TABLE tabulka MODIFY ( nová definice sloupce, … ); Př. ALTER TABLE Osoba MODIFY ( Poznamka CHARACTER VARYING(2000) ); Lze měnit –NULL na NOT NULL a naopak –Šířku sloupce Zvětšení Zmenšení (pokud je sloupec prázdný)

59 Spojování tabulek v SELECT příkazu

60 DBI026 -DB Aplikace - MFF UK Spojování tabulek Norma SQL-92 zavedla více typů spojování tabulek v klauzuli WHERE včetně podmínek –Kartézský součin –Spojení –Přirozené spojení –Vnější spojení Předchozí normy dovolovaly pouze –čárkami oddělený seznam zdrojů (tabulek a pohledů) –u každého zdroje bylo možné uvést alias, oddělený mezerou –podmínky spojení výhradně v klauzuli WHERE

61 DBI026 -DB Aplikace - MFF UK Spojování tabulek ANSI SQL-92 syntaxe –dovoluje použití klíčového slova AS pro oddělení definice aliasu od zdroje dat … FROM Emp AS E, Dept AS D –Rozlišuje jednotlivé způsoby spojení pomocí dalších klíčových slov –Uvádí podmínky spojení v klauzuli FROM –Klauzule WHERE slouží pro uvedení dodatečných podmínek (selekci)

62 DBI026 -DB Aplikace - MFF UK Spojování tabulek X CROSS JOIN Y –kartézský součin –ekvivalent předchozího stylu zápisu X, Y SELECT EmpNo, Loc FROM Emp CROSS JOIN Dept; EmpNoDeptNo 20NEW YORK 30DALLAS DeptNoLoc EmpNoDeptNo 20NEW YORK 30DALLAS DeptNoLoc NEW YORK 30DALLAS

63 DBI026 -DB Aplikace - MFF UK Spojování tabulek X NATURAL [INNER] JOIN Y –přirozené spojení přes všechny společné sloupce tabulek SELECT EmpNo, Loc FROM Emp NATURAL JOIN Dept; EmpNoDeptNo 20NEW YORK 30DALLAS DeptNoLocEmpNoDeptNoLoc NEW YORK

64 DBI026 -DB Aplikace - MFF UK Spojování tabulek Oracle vs. ANSI SQL-92 X [INNER] JOIN Y ON (podmínka) –standardní spojení tabulek, ekvivalent zápisu FROM … X, Y … WHERE podmínka X [INNER] JOIN Y USING (sloupce) –standardní spojení přes rovnost uvedených sloupců (v obou tabulkách se musí jmenovat shodně)

65 DBI026 -DB Aplikace - MFF UK Vnější spojování tabulek Místo INNER je možné uvést jednu z možností –LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] Pokud je uvedeno … X LEFT JOIN Y ON (podmínka)... Jsou ve výsledku všechny řádky levé tabulky (X), i když k nim neexistuje žádná odpovídající řádka z pravé tabulky (Y)

66 DBI026 -DB Aplikace - MFF UK Vnější spojování tabulek Místo INNER je možné uvést jednu z možností –LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL LEFT JOIN Dept; –Ve výsledku jsou uvedeni i zaměstnanci, kteří nejsou v žádném oddělení –Neexistující položky z oddělení jsou vyplněny NULL hodnotami EmpNoDeptNoLoc NEW YORK

67 DBI026 -DB Aplikace - MFF UK Vnější spojování tabulek Místo INNER je možné uvést jednu z možností –LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL RIGHT JOIN Dept; –Ve výsledku jsou uvedena i oddělení, ve kterých nejsou žádní zaměstnanci –Neexistující položky z oddělení jsou vyplněny NULL hodnotami EmpNoDeptNoLoc 30DALLAS NEW YORK

68 DBI026 -DB Aplikace - MFF UK Vnější spojování tabulek Místo INNER je možné uvést jednu z možností –LEFT [OUTER], RIGHT [OUTER], FULL [OUTER] SELECT * FROM Emp NATURAL FULL JOIN Dept; –Kombinace NATURAL LEFT OUTER JOIN a NATURAL RIGHT OUTER JOIN zároveň EmpNoDeptNoLoc NEW YORK 30DALLAS

69 DBI026 -DB Aplikace - MFF UK Vnější spojování tabulek v Oracle Oracle má i svoji nativní syntaxi pro vnější spojení –Starší, pouze pro rovnost hodnot sloupců –Použití ANSI SQL je silnější a přenositelné Levé vnější spojení –SELECT * FROM Dept, Emp WHERE Dept.Deptno = Emp.Deptno(+); Pravé vnější spojení –SELECT * FROM Dept, Emp WHERE Dept.Deptno(+) = Emp.Deptno; Oboustranné neexistuje

70 Optimalizace SQL dotazů Indexy Plány provedení dotazu Ovlivnění optimalizátoru

71 DBI026 -DB Aplikace - MFF UK Indexy Slouží pro zrychlení přístupu k datům na základě podmínky ve WHERE klauzuli Nemění syntaxi ani sémantiku příkazů pro manipulaci s daty –Unikátní vs. neunikátní –Jednosloupcové vs. vícesloupcové –B-stromy vs. bitmapy –Nad sloupci vs. nad výrazy –Doménové indexy (fulltextové, prostorové, …)

72 DBI026 -DB Aplikace - MFF UK Indexy Tvorba indexů není v SQL-92 standardizována Jednotlivé databázové systémy řeší tvorbu indexů svými prostředky, které jsou navzájem více či méně podobné –Může se lišit syntaxe podpora různých typů indexů jejich (ne)použití pro daný dotaz a obsah tabulky

73 DBI026 -DB Aplikace - MFF UK B-tree indexy Obvykle redundantní B+ stromy –Hodnoty v listech –Listy oboustranně linkované pro snadný sekvenční průchod. –Vhodné pro sloupce s vysokou selektivitou (počtem různých hodnot ve sloupci). –Vícesloupcové (složené) indexy mohou zvýšit selektivitu. Použitelné, pokud dotaz omezuje hodnoty prvních k sloupců indexu, přičemž prvních k-1 sloupců musí být omezeno na rovnost Nepoužitelné, pokud v dotazu není omezení na první sloupec indexu –Nad jednou tabulkou v jednom dotazu nelze obvykle kombinovat více B-tree indexů. Dotaz se vyhodnocuje s použitím jednoho z indexů a ostatní podmínky se dopočítávají

74 DBI026 -DB Aplikace - MFF UK Bitmapové indexy Pro každou hodnotu sloupce / výrazu vytvořen binární řetězec obsahující 1 právě pro řádky s danou hodnotou –Vhodné pro sloupce s nízkou selektivitou –Lze kombinovat více bitmapových indexů nad jednou tabulkou pro zvýšení selektivity –Kombinací více bitmap se zvyšuje selektivita indexu SELECT * FROM Obyvatel WHERE Pohlaví=’M’ AND (Kraj=’Pha’ OR Kraj=’SČ’); Kombinace tří bitmapových řetězců M PhaPha SČSČ (( )= 

75 DBI026 -DB Aplikace - MFF UK Kdy indexy (ne)pomohou Nepomohou –Pokud je procento vyhovujících záznamů velké zvýšená režie s přístupem k řádkům v nesekvenčním pořadí, daném indexem –Při dotazech na hodnotu NULL v indexech se běžně neukládají Pomohou –V dotazech na rovnost sloupce s konstantou –V dotazech na náležení hodnoty do intervalu

76 DBI026 -DB Aplikace - MFF UK Kdy (ne)vytvářet indexy Jak Oracle, tak MS SQL vytváří automaticky unikátní indexy pro –primární klíče jméno bývá shodné se jménem omezení –kandidátní klíče (UNIQUE sloupce) jméno bývá shodné se jménem omezení

77 DBI026 -DB Aplikace - MFF UK Kdy (ne)vytvářet indexy Důležité je vytvářet indexy pro cizí klíče !!! –Zrychlení odezvy při manipulaci s nadřízenou tabulkou Při rušení nadřízené řádky je bez indexu nutné projít celou podřízenou tabulku, zda neobsahuje závislé řádky Pokud je aktivované kaskádové mazání a odkazy jsou víceúrovňové, pro každou nalezenou podřízenou řádku je nutné projít celou její pořízenou tabulku atd. atd. –Průchod tabulkou čte i bloky, obsahující zrušené záznamy v tabulce –Průchod přes index najde efektivně všechny existující závislé řádky bez nutnosti čtení samotné tabulky –Např. Oracle řeší nemožnost efektivně najít a zamknout podřízené řádky zamknutím celé podřízené tabulky, čímž velmi omezuje možnost běhu aplikace s více uživateli.

78 DBI026 -DB Aplikace - MFF UK Kdy (ne)vytvářet indexy Indexy by se jinak měly vytvářet jen v případě, pokud výrazně pomohou často kladeným dotazům –V opačném případě spíše zdržují aktualizační operace

79 DBI026 -DB Aplikace - MFF UK Indexy Indexy nad sloupci CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1, sloupec2, …); –Př. CREATE INDEX Osoba_Pr_Jm_Inx ON Osoba(Prijmeni,Jmeno); –Index lze použít v příkazu, omezujícím první použitý sloupec SELECT * From Osoba WHERE Prijmeni=’Svoboda’;

80 DBI026 -DB Aplikace - MFF UK Indexy Indexy nad sloupci CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1, sloupec2, …); –Př. CREATE INDEX Osoba_Pr_Jm_Inx ON Osoba(Prijmeni,Jmeno); –Index nelze použít v příkazu, omezujícím jen druhý použitý sloupec SELECT * From Osoba WHERE Jmeno=’Zdeněk’;

81 DBI026 -DB Aplikace - MFF UK Unikátní indexy Vhodnější je definovat unikátnost pomocí integritních omezení PRIMARY KEY a UNIQUE Kromě unikátních indexů jsou tak definována i samotná omezení

82 DBI026 -DB Aplikace - MFF UK Indexy Indexy s definicí třídění CREATE [UNIQUE] INDEX jméno_indexu ON jméno_tabulky(sloupec1 [{ASC|DESC}], …); –Definují směr třídění v jednotlivých sloupcích –Mohou pomoci určit výsledné pořadí záznamů bez provádění třídících operací během SELECT příkazu –Př. CREATE INDEX Zamestnanec_Zarazeni_Plat_Inx ON Zamestnanec(Zarazeni, Plat DESC);

83 DBI026 -DB Aplikace - MFF UK Bitmapové indexy Bitmapové indexy (jsou vždy neunikátní) CREATE BITMAP INDEX jméno_indexu ON jméno_tabulky({sloupec1|výraz1}, …); –Př. CREATE BITMAP INDEX Vyuka_Den_Inx ON Vyuka(DenVTydnu);

84 DBI026 -DB Aplikace - MFF UK CLUSTERED vs. NONCLUSTERED indexy CLUSTERED –Nejvýše jeden – defaultně primární klíč –Pokud existuje Data v tabulce tříděna dle sloupců indexu (ISF) Ostatní indexy odkazují na hodnoty těchto sloupců –Pokud neexistuje Data v tabulce netříděná (HEAP) Ostatní indexy odkazují na řádky NONCLUSTERED

85 DBI026 -DB Aplikace - MFF UK CLUSTERED vs. NONCLUSTERED indexy create table nahalde( id numeric(5) identity (100,10) constraint nahalde_pk primary key NONCLUSTERED, nazev character varying(10) constraint nahalde_u_nazev unique ); select object_id, name, index_id iid, type typ, type_desc from sys.indexes; object_id | name |iid|typ| type_desc | kategorie_pk | 1 | 1 | CLUSTERED | kategorie_u_naz| 2 | 2 | NONCLUSTERED | NULL | 0 | 0 | HEAP | nahalde_u_nazev| 2 | 2 | NONCLUSTERED | nahalde_pk | 3 | 2 | NONCLUSTERED

86 DBI026 -DB Aplikace - MFF UK Index Oranized Tables Obdoba CLUSTERED u MS SQL –Tabulka setříděná dle primárního klíče, celé řádky tvoří listovou úroveň indexu –Ostatní indexy obsahují tzv. logické ROWID Primární klíč + předpokládanou adresu CREATE TABLE Osoba( RC VARCHAR2(11) CONSTRAINT Osoba_PK PRIMARY KEY, … ) ORGANIZATION INDEX;

87 DBI026 -DB Aplikace - MFF UK Indexy Zrušení indexu ORACLE:DROP INDEX jméno_indexu; MSSQL: DROP INDEX tabulka.jméno_indexu;

88 DBI026 -DB Aplikace - MFF UK Datový slovník Informace o indexech jsou v Oracle uloženy v pohledech –USER_INDEXES –USER_IND_COLUMNS Informace o indexech jsou v MS SQL uloženy v pohledech –INFORMATION_SCHEMA.INDEXES

89 DBI026 -DB Aplikace - MFF UK Na co si dát při návrhu pozor Používat správné typy indexů Negenerovat bez uvážení indexy pro všechny sloupce tabulky a jejich kombinace –Zdržují se aktualizace dat –Zvyšuje se nárok na diskový prostor

90 DBI026 -DB Aplikace - MFF UK Na co si dát při návrhu pozor Při návrhu dotazů využívat prostředky daného serveru pro –zjištění té nejlepší varianty dotazu –ovlivnění způsobu vyhodnocení dotazu Optimalizátory databází mají své meze –pro nalezení optimálního plánu se používají heuristické postupy –Neuvažují se zdaleka všechny kombinace pořadí tabulek a indexů

91 DBI026 -DB Aplikace - MFF UK Optimalizace dotazů Jeden dotaz lze napsat více způsoby –Shodná sémantika –Rozdílný způsob výpočtu výsledku –Doba výpočtu se může lišit i řádově !! O způsobu výpočtu rozhoduje optimalizátor uvnitř databázového serveru Potřebné je –Umět zjistit, jakým způsobem výpočet proběhne –Zvolit nejlépe optimalizovatelný zápis dotazu nebo optimalizátoru pomoci s výběrem

92 DBI026 -DB Aplikace - MFF UK Co obsahuje plán provedení Strom elementárních operací –Vyhodnocuje se post-order metodou, operace v kořeni získá celý požadovaný výsledek –Nástin obsahu plánu V listech přístupy ke zdrojům –Index UNIQUE SCAN –Index RANGE SCAN –Table FULL SCAN Ve vnitřních uzlech –Přístupy k řádku tabulky podle indexu –Spojení tabulek (vnořené cykly, MERGE JOIN, HASH JOIN) –Třídící operace –Filtry dle dodatečných podmínek

93 DBI026 -DB Aplikace - MFF UK Typy optimalizace V Oracle –Starší RULE BASED optimalizace (RBO) Odvozuje plán ze syntaxe příkazu a existence indexů –Novější COST BASED optimalizace (CBO) Oracle 8+, doporučována pro lepší vlastnosti Založena na statistikách, počítá cenu zdrojů provedení operace (čas, prostor, třídící operace, …) Dokáže rozlišit plány i pro různé hodnoty konstant v dotazu

94 DBI026 -DB Aplikace - MFF UK Rule-Based Optimalizace dotazů Cena přístupu k podmnožině řádek v tabulce v klesajícím pořadí –Full-scan Prochází se celá tabulka, u každé řádky se ověří podmínka Může být vhodné, pokud procento vyhovujících řádek je dost velké –Index-Range-Scan Vyhledání intervalu v indexu, ověření ostatních podmínek v odkazovaných řádcích –Unique-Index-Scan Vyhledání jediné možné vyhovující řádky podle unikátního indexu –ROWID-Scan Vyhledání řádky na základě známé hodnoty jejího fyzického identifikátoru v databázi

95 DBI026 -DB Aplikace - MFF UK Optimalizace dotazů Cena operace JOIN dvou tabulek –Databáze se snaží zvolit tabulku s dražším přístupem jako hlavní tabulku –Ke každé nalezené vyhovující řádce dohledává odpovídající řádky ve druhé tabulce –Pokud obě tabulky nabízí pouze Full-Scan, data obou se setřídí a provede se Merge-Join

96 DBI026 -DB Aplikace - MFF UK Optimalizace dotazů Jak zjistit způsob provedení příkazu? –Nejprve je nutné mít tabulku PLAN_TABLE s odpovídající strukturou, do které plánovač ukládá informace o plánu provedení –SQL*Plus nabízí přepínač SET AUTOTRACE {OFF|ON|TRACEONLY} –Oracle obsahuje příkaz EXPLAIN PLAN

97 DBI026 -DB Aplikace - MFF UK Tabulka PLAN_TABLE Zajímavé sloupce STATEMENT_IDVARCHAR2(30) OPERATIONVARCHAR2(30) OPTIONSVARCHAR2(30) OBJECT_OWNERVARCHAR2(30) OBJECT_NAMEVARCHAR2(30) OBJECT_TYPEVARCHAR2(30) IDNUMBER(38) PARENT_IDNUMBER(38) COSTNUMBER(38) … Identifikátor příkazu, shodný pro všechny řádky plánu Operace (SCAN, SORT, …) Upřesnění operace (FULL, RANGE, UNIQUE, …) Vlastník zdroje Jméno zdroje Typ zroje (TABLE, INDEX, CLUSTER, …) Identifikace kroku v plánu s daným STATEMENT_ID Identifikace rodičovského kroku ve stromu provedení Odhadovaná cena … Strom plánu se čte od listů ke kořeni –Rodičovská operace se provádí po dokončení operací v potomcích –Kořenová operace má ID=0

98 DBI026 -DB Aplikace - MFF UK Příkaz EXPLAIN PLAN EXPLAIN PLAN SET STATEMENT_ID = ’jméno’ [INTO tabulka] FOR příkaz; EXPLAIN PLAN SET STATEMENT_ID = ’emp_dept’ FOR SELECT Emp.*, Dept.Loc FROM Dept, Emp WHERE Dept.DeptNo = Emp.Deptno;

99 DBI026 -DB Aplikace - MFF UK Příkaz EXPLAIN PLAN Získání plánu provedení – a) vlastním příkazem SELECT LPad(' ',2*Level-1)||operation ||' '||options ||' '||object_name AS text FROM Plan_Table START WITH Statement_ID=’příkaz’ AND ID = 0 CONNECT BY Parent_ID = PRIOR ID AND Statement_ID = PRIOR Statement_ID;

100 DBI026 -DB Aplikace - MFF UK Příkaz EXPLAIN PLAN Získání plánu provedení – b) příkazem (verze 10+) select plan_table_output from table( dbms_xplan.display( 'PLAN_TABLE',{ statement_id |null}, {'ALL'|'TYPICAL'|'BASIC'|'SERIAL'} ) ); PLAN_TABLE_OUTPUT | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| | 0 | SELECT STATEMENT | | | 1893K| 270 (2)| | 1 | NESTED LOOPS | | | 1893K| 270 (2)| | 2 | INDEX RANGE SCAN | MF_CISPOLATR_SK_ATR_DO_PBCP | 12 | 216 | 3 (0)| | 3 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | |

101 DBI026 -DB Aplikace - MFF UK Optimalizace dotazů Jak zjistit způsob provedení příkazu? –Např. konzola ISQL nabízí možnost zobrazit textově plán provedení příkazu sekvencí příkazů set showplan_text on go go

102 DBI026 -DB Aplikace - MFF UK Query Analyzer Grafická reprezentace plánu provedení –Vložení příkazu –Stisk CTRL+L

103 DBI026 -DB Aplikace - MFF UK Jak psát optimalizovatelné dotazy Obvyklá rada: v aplikacích používat místo konstant tzv. placeholdery a aplikační proměnné –Dva „různé“ dotazy mají dva samostatné, i když shodné, plány provedení. Jejich vytvoření zabírá čas a jiné zdroje databáze SELECT * FROM Emp WHERE DeptNo=10; SELECT * FROM Emp WHERE DeptNo=20; SELECT * FROM Emp WHERE DeptNo=:d; –Někdy ovšem mohou dva plány, získané s využitím CBO pomoci, (pokud se princip provedení odůvodněně liší). SELECT * FROM Vojaci WHERE Pohlavi=’M’ SELECT * FROM Vojaci WHERE Pohlavi=’Ž’ 90% dat (full s.) 10% dat (range s.)

104 DBI026 -DB Aplikace - MFF UK Jak psát optimalizovatelné dotazy Jeden dotaz psát všude přesně stejně –Různé zápisy databáze vždy znovu analyzuje a vymýšlí plán provedení SELECT * FROM Emp WHERE Ename LIKE ’A%’ AND DeptNo=10; SELECT * FROM Emp WHERE DeptNo=10 AND Ename LIKE ’A%’;

105 DBI026 -DB Aplikace - MFF UK Nevýhody rule-based optimalizace Pokud existuje více neunikátních indexů na jedné tabulce, nemusí (RBO) optimalizátor vybrat ten nejlepší SELECT * FROM Osoba WHERE Jmeno=’Jan’ AND Mesto=’Praha’; –Buďto se přes index hledají Janové, a ověřuje se bydliště, nebo se hledají Pražáci a ověřuje se jméno

106 DBI026 -DB Aplikace - MFF UK Nevýhody rule-based optimalizace Použití určitého indexu je možné optimalizátoru znemožnit použitím (i neutrálního) výrazu v dotazu SELECT * FROM Osoba WHERE CONCAT(Jmeno,’’)=’Jan’ AND Mesto=’Praha’; –Index přes jméno nelze použít, použije se tedy index přes město –Pozn.: sofistikovanější optimalizátor by mohl takovéto „úpravy“ odhalit a dotaz přepsat

107 DBI026 -DB Aplikace - MFF UK Cost-based optimalizace Pro jednotlivé plány se počítá cena provedení v řadě hledisek –Množství I/O operací, řádek, Byte, … –Cena prováděných třídících operací –Cena za HASH operace Vybírá se plán s nejnižší váženou cenou

108 DBI026 -DB Aplikace - MFF UK Cost-based optimalizace Využívá statistických informací o datech –Počet různých hodnot ve sloupci, Histogramy rozložení hodnot ve sloupci, Počet řádek v tabulce, Průměrná délka jedné řádky Pro konkrétní hodnotu nebo interval hodnot lze odhadnout –procento vyhovujících řádek v tabulce –jejich datový objem

109 DBI026 -DB Aplikace - MFF UK Cost-based optimalizace V Oracle CBO dovoluje používat indexy přes výrazy (RBO je nepodporuje) –CREATE INDEX Emp_Income_INX ON Emp(Sal+COALESCE(Comm,0)); Dotaz se shodným zápisem výrazu může index použít –SELECT EName FROM Emp WHERE Sal+COALESCE(Comm,0) > 25000; Dotaz s upraveným zápisem index použít nedokáže –SELECT EName FROM Emp WHERE COALESCE(Comm,0)+Sal > 25000;

110 DBI026 -DB Aplikace - MFF UK Výběr typu optimalizace Výběr optimalizace –ALTER SESSION SET OPTIMIZER_MODE *) = CHOOSE – výběr podle (ne)přítomnosti statistik nejsou-li k dispozici, potom RBO, jinak CBO ALL_ROWS – vždy CBO, minimalizuje se cena za získání všech řádek odpovědi –Vhodné pro dávkové zpracování. FIRST_ROWS – vždy CBO, minimalizuje se cena za získání prvních řádek odpovědi. –Vhodné pro interaktivní zpracování. RULE – vždy RBO *) Pozn.: Starší syntaxe: OPTIMIZER_GOAL

111 DBI026 -DB Aplikace - MFF UK Tvorba statistik ANALYZE TABLE jm_tabulky {COMPUTE | ESTIMATE | DELETE} STATISTICS [FOR {TABLE | ALL [INDEXED] COLUMNS}]; DBMS_UTILITY.ANALYZE_SCHEMA( ’jm_schematu’,{’compute’ | ’delete’ | ’estimate’} ); DBMS_STATS.GATHER_SCHEMA_STATS(’jm_sch’); Pohledy v datovém slovníku –INDEX_STATS, USER_TAB_COL_STATISTICS USER_USTATS

112 DBI026 -DB Aplikace - MFF UK Tvorba statistik Standardně povolen přepínač AUTO_CREATE_STATISTICS –Statistiky se generují automaticky –ALTER DATABASE dbname SET AUTO_CREATE_STATISTICS {ON|OFF} Ručně pomocí –sp_createstats Př. vytvoření dodatečné statistiky pro dvousloupcovou hodnotu na základě vzorku dat –CREATE STATISTICS FirstLast ON Person.Contact(FirstName,LastName) WITH SAMPLE 50 PERCENT

113 DBI026 -DB Aplikace - MFF UK Co statistiky obsahují Tabulky –Počet řádek –Počet datových bloků na řádku –… Sloupce –Počet různých hodnot –Počet NULL hodnot –Histogramy hodnot (kolik hodnot připadne do daného intervalu) –…

114 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) Pomocí plusových komentářů bezprostředně za prvním klíčovým slovem příkazu SELECT/UPDATE/INSERT/DELETE SELECT --+ seznam hintů SELECT /*+ seznam hintů */ –Možné použít pro volbu typu optimalizace SELECT /*+ RULE */ * FROM EMP …; SELECT /*+ FIRST_ROWS */ * FROM EMP …; Použití hintu (kromě RULE) vždy použije CBO na základě statistik. Pokud nejsou statistiky spočteny, výsledek optimalizace je kontraproduktivní.

115 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) Základní nastavení optimalizátoru –CHOOSE Optimalizátor vybere metodu dle přítomnosti/nepřítomnosti statistik –RULE Optimalizátor použije optimalizaci založenou na pravidlech i v případě, že má k dispozici statistiky –ALL_ROWS Optimalizátor se bude snažit minimalizovat cenu za zpracování všech řádek v dotazu či příkazu –FIRST_ROWS, FIRST_ROWS(n) Optimalizátor bude minimalizovat cenu za získání první, resp. prvních n řádek

116 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) Další možnosti (výběr dat z tabulek) –FULL(jm_tabulky) Full-scan pro tabulku –INDEX (jm_tabulky jm_indexu) Pro průchod tabulkou se použije požadovaný index –NO_INDEX (jm_tabulky jm_indexu) Pro průchod tabulkou se nepoužije požadovaný index –ORDERED Při spojování tabulek se použije pořadí uvedené ve FROM –USE_NL, USE_MERGE, USE_HASH Spojení pomocí vnořených cyklů, merge-join, hash-join

117 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) FULL(jm_tabulky) –SELECT /*+ FULL(Emp) */ EmpNo, Ename FROM Emp WHERE EName>’X’; –Použít FULL SCAN i přes případně malé procento vracených řádek –Pokud má tabulka alias, je v hintu tento alias, to dovoluje mít v dotazu jednu tabulku vícekrát a nápovědu cílit na konkrétní výskyt

118 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) INDEX(jm_tabulky index [index …]) –SELECT --+ INDEX(Emp ENameInx EDeptInx) EmpNo, Ename FROM Emp WHERE EName LIKE’SC%’ AND DeptNo>50; –Použít ten z uvedených indexů, který nabízí nejnižší cenu provedení operace a ostatní případné indexy nad tabulkou neuvažovat

119 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) NO_INDEX(jm_tabulky index [index …]) –SELECT --+ NO_INDEX(Emp ENameInx) EmpNo, Ename FROM Emp WHERE EName LIKE’SC%’ AND DeptNo>50; –Index přes EName se nebude pro vytvoření plánu uvažovat

120 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) ORDERED –SELECT --+ ORDERED EmpNo, Ename FROM Emp, Dept WHERE …; –Tabulky se budou spojovat v pořadí, v jakém jsou uvedené ve FROM klauzuli –Při plánování ušetří čas, jinak nutný pro další možná pořadí spojování

121 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) SELECT … OPTION (hint …); Hintem může být: { { HASH | ORDER } GROUP { CONCAT | HASH | MERGE } UNION { LOOP | MERGE | HASH } JOIN | FAST number_rows | FORCE ORDER | MAXDOP number_of_processors | OPTIMIZE FOR { UNKNOWN | = literal_constant } [,...n ] ) | …

122 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) { { HASH | ORDER } GROUP –Způsob realizace GROUP BY operace { CONCAT | HASH | MERGE } UNION –Způsob realizace spojení výsledku dvou SELECT příkazů s vynecháním duplicit { LOOP | MERGE | HASH } JOIN –Způsob realizace spojování tabulek FAST number_rows –Dotaz optimalizován na rychlé získání prvních number_rows řádek

123 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) FORCE ORDER –Zachování pořadí spojování tabulek tak, jak jsou v SELECTu MAXDOP number_of_processors –Omezení maximálního stupně paralelismu v dotazu OPTIMIZE FOR { UNKNOWN | = literal_constant } [,...n ] ) –Pokud příkaz obsahuje proměnnou, předpokládá se nějaká konkrétní hodnota, nebo naopak neznámá hodnota

124 DBI026 -DB Aplikace - MFF UK Nápověda optimalizátoru (hinty) FORCE ORDER –Zachování pořadí spojování tabulek tak, jak jsou v SELECTu MAXDOP number_of_processors –Omezení maximálního stupně paralelismu v dotazu OPTIMIZE FOR { UNKNOWN | = literal_constant } [,...n ] ) –Pokud příkaz obsahuje proměnnou, předpokládá se nějaká konkrétní hodnota, nebo naopak neznámá hodnota

125 #INCLUDE dbacv_02.ppt #INCLUDE dbacv_03.ppt Optimalizace Příklady

126 Pohledy Přednáška č. 3

127 DBI026 -DB Aplikace - MFF UK Pohledy nad relačními tabulkami Pohled ~ pojmenovaný SELECT příkaz Reprezentuje virtuální tabulku Při dotazu nad pohledem se pohled vždy znovu rozvíjí v rámci položeného dotazu

128 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Příkazem CREATE VIEW jmeno_pohledu [jmeno_sloupce [, …]] AS SELECT … [WITH [{CASCADE | LOCAL} CHECK OPTION]

129 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Příklad: CREATE VIEW Obyvatel_Brna AS SELECT * FROM Obyvatel WHERE Mesto=’Brno’;

130 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Sloupce mohou být explicitně pojmenované –Pokud nejsou, zdědí jména sloupců ze SELECT příkazu WITH CHECK OPTION zajistí, aby vkládané či aktualizované řádky po provedení odpovídaly podmínce v pohledu –Pokud by řádka nebyla v pohledu viditelná, aktualizace je odmítnuta

131 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Příklad: CREATE VIEW Obyvatel_Brna AS SELECT * FROM Obyvatel WHERE Mesto=’Brno’ WITH CHECK OPTION; -- chybná aktualizace UPDATE Obyvatel_Brna SET Mesto=’Ostrava’ WHERE RC=’751015/1234’;

132 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Použití pohledů –Odstínění nutnosti spojení více (normalizovaných) tabulek –Individualizace zobrazených dat pro uživatele Různí uživatelé mohou ve stejném pohledu vidět různé řádky Různí uživatelé mohou mít definován stejný pohled různě a zobrazovat jiné sloupce …

133 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Příklad: CREATE VIEW Zam_Moje_Odd AS SELECT Z.Cislo, Z.Prijmeni, Z.Jmeno, Z.Zarazeni FROM Zamestnanec AS Z, Zamestnanec AS X WHERE X.Login=CURRENT_USER AND Z.Oddeleni=X.Oddeleni;

134 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Některým nevhodně napsaným aplikacím může posun v pořadí ve sloupcích pohledu (nebo i samotné zvýšení počtu sloupců) přinést problémy Při vytváření pohledů je obvykle vhodné zajistit, aby se spolu s přidáváním sloupců do tabulek neposunovaly sloupce stejného významu na jiné pozice v seznamu sloupců –Explicitně vyjmenovat sloupce v SELECT příkazu Navíc vhodné všechny sloupce kvalifikovat, buďto jménem tabulky, nebo jejím aliasem –Explicitně pojmenovat sloupce pohledu

135 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Jak zabránit posunu sloupců v pohledech, které používají symbol * pro zobrazení všech řádek? –V pohledu nad více pospojovanými tabulkami je vhodné použít * maximálně jednou, pro sloupce konkrétní tabulky (použitím kvalifikátoru jměna tabulky jm_tabulky.*). –Za ní už by neměly být žádné sloupce vyjmenované.

136 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Příklad: CREATE VIEW Zam_Odd AS SELECT Z.RC, Z.Jmeno, O.* FROM Zamestnanec AS Z NATUAL RIGHT OUTER JOIN Oddeleni AS O;

137 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Není vhodné do pohledu dávat ORDER BY klauzuli –Ne vždy je dotaz nad pohledem nutné třídit –Někdy je potřeba zcela jiné třídění –V řadě případů se více pohledů spojuje v dotazu dohromady a třídění každého z nich může zdržovat

138 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Při konstrukci dotazů nad více pohledy je vždy vhodné prověřit výsledek plánovačem, ne vždy se optimalizátoru podaří najít vhodný plán provedení Není příliš vhodné používat pohledy obsahující GROUP BY v dalších dotazech. Velmi špatně se optimalizují

139 DBI026 -DB Aplikace - MFF UK Vytváření pohledů Příklad: CREATE VIEW Pocty_Obyvatel AS SELECT Mesto, COUNT(*) AS Velikost FROM Obyvatel GROUP BY Mesto; SELECT * FROM Pocty_Obyvatel WHERE Mesto=’BRNO’;

140 DBI026 -DB Aplikace - MFF UK Rušení pohledů Příkazem DROP VIEW jmeno_pohledu;

141 DBI026 -DB Aplikace - MFF UK Odlišnosti v implementaci CREATE VIEW jm [(sloupec [, …])] AS SELECT … [WITH {CHECK OPION | READ ONLY}]; Seznam sloupců v závorkách WITH READ ONLY nedovoluje žádnou aktualizaci CREATE VIEW jm [(sloupec [, …])] [WITH ENCRYPTION] AS SELECT … [WITH CHECK OPION];

142 DBI026 -DB Aplikace - MFF UK Datový slovník USER_VIEWS USER_TAB_COLUMNS INFORMATION_SCHEMA. VIEWS

143 Procedurální rozšíření SQL PL/SQL vs. Transact SQL

144 DBI026 -DB Aplikace - MFF UK Procedurální rozšíření SQL proč jej používat Ve standardním SQL server obdrží a vyhodnotí vždy jednotlivý příkaz. V daném případě se odešle 2n paketů na server a 2n paketů zpět. for (;;) { FETCH; if (…) break; if (…) INSERT …; else UPDATE …; }; n x

145 DBI026 -DB Aplikace - MFF UK Procedurální rozšíření SQL proč jej používat Pomocí procedurálního rozšíření je možné na server odeslat a zpracovat rozsáhlejší kus kódu včetně řízení toku V daném případě se odešle 1 paket na server a 1 paket zpět. LOOP FETCH; EXIT WHEN (…); IF (…) THEN INSERT …; ELSE UPDATE …; END LOOP; 1 1

146 DBI026 -DB Aplikace - MFF UK Procedurální rozšíření SQL proč jej používat Šetření komunikačního kanálu –Menší množství odesílaných povelů v jednom povelu je vetší množství příkazů –Podstatně menší objem přenesených dat Data se zpracují na serveru bez přenosu na klienta –Odlehčení klienta Možnost ukládat a vykonávat kód na serveru Kód na serveru může být používán všemi klientskými aplikacemi

147 DBI026 -DB Aplikace - MFF UK Procedurální rozšíření SQL použití Rozšíření možností serveru o další uživatelské funkce a procedury Zvýšená ochrana integrity dat –Triggery –Zapouzdření povolených manipulací s daty do procedur a funkcí Aplikace nemusí mít práva pro přímý přístup k tabulkám

148 DBI026 -DB Aplikace - MFF UK Procedurální rozšíření SQL problémy Podstatně menší přenositelnost než v případě definic tabulek a příkazů pro manipulaci s daty (INSERT, UPDATE, DELETE) Standardizováno poprvé v SQL-99 –Řada proprietárních řešení v jednotlivých implementacích serverů –Navzájem nekompatibilní

149 DBI026 -DB Aplikace - MFF UK Struktura Bloky kódu s pevnou strukturou Příkazy ukončené středníkem [DECLARE deklarace] BEGIN výkonná část [EXCEPTION ošetření výjimek] END; Posloupnosti příkazů Nemusí být ukončeny středníkem DECLARE sekce je chápána jako příkaz BEGIN … END také

150 DBI026 -DB Aplikace - MFF UK Struktura DECLARE podil NUMBER; BEGIN SELECT citatel/jmenovatel INTO podil FROM Zlomky WHERE citatel=123; IF podil > 0 THEN UPDATE Zlomky SET Vysledek=Podil WHERE citatel=123; END IF; END; FLOAT = citatel/jmenovatel FROM Zlomky WHERE citatel=123 > 0 UPDATE Zlomky SET Vysledek WHERE citatel=123

151 DBI026 -DB Aplikace - MFF UK Deklarace proměnných jméno [CONSTANT] typ [:= výraz]; Základní typy –Standardní –BOOLEAN obsahující TRUE, FALSE, [AS] typ

152 DBI026 -DB Aplikace - MFF UK Deklarace typu v PL/SQL Explicitně jménem –X NUMERIC(7,2); Kopírováním typu jiné proměnné –Y X%Type; Kopírováním typu sloupce –E EMP.Ename%Type; Kopírováním typu řádku –R EMP%RowType; Record, obsahující pole odpovídající sloupcům Přístup pomocí obvyklé tečkové notace

153 DBI026 -DB Aplikace - MFF UK Příkazy Prázdný příkaz NULL; Přiřazovací příkaz prom := výraz; SQL příkaz UPDATE Emp SET Sal = Sal*1.05; DELETE FROM Emp WHERE EmpNo=1; Přiřazovací příkaz = výraz SQL příkaz UPDATE Emp SET Sal = Sal*1.05; DELETE FROM Emp WHERE EmpNo=1

154 DBI026 -DB Aplikace - MFF UK Příkazy SELECT, vracející právě jednu řádku SELECT výr 1 [, …] INTO prom 1 [, …] FROM … WHERE …; SELECT, vracející právě jednu řádku 1 = výr 1 [, …] FROM … WHERE …;

155 DBI026 -DB Aplikace - MFF UK PL/SQL procedury CREATE [OR REPLACE] PROCEDURE jmproc [(deklarace_parametru [, …])] {AS | IS} blok_bez_klíčového_slova_DECLARE; –Deklarace parametru jméno [IN] [OUT] typ [{:= | DEFAULT} výraz] –IN parametr lze uvnitř procedury číst –OUT parametr lze uvnitř procedury měnit –Volání procedury v SQL*Plus (v PL/SQL standardně) EXEC jmproc[(výraz [, …])] –Parametry se předávají podle pořadí EXEC jmproc[(jméno=>výraz [, …]) –Parametry se předávají podle jména

156 DBI026 -DB Aplikace - MFF UK PL/SQL procedury CREATE PROCEDURE UpdEmpSal ( xEmpNo NUMBER, xSal NUMBER, xComm NUMBER DEFAULT NULL ) AS BEGIN UPDATE Emp SET Sal = xSal, Comm = xComm WHERE EmpNo=xEmpNo; END; / EXEC UpdEmpSal(1234,15500) -- bez odměn; EXEC UpdEmpSal(4321,14000,500); Velikost typů se u parametrů neuvádí

157 DBI026 -DB Aplikace - MFF UK T-SQL procedury CREATE PROCEDURE jmproc [; číslo] [deklarace_parametru [, …]] [WITH RECOMPILE] AS příkazy [;] –Deklarace typ [= výraz] [OUT[PUT]] –OUT[PUT] parametr je výstupní –číslo umožňuje vytvoření více verzí stejné procedury –Volání procedury EXEC[UTE] jmproc [výraz [, …]] –Parametry se předávají podle pořadí EXEC[UTE] jmproc [, …]] –Parametry se předávají podle jména

158 DBI026 -DB Aplikace - MFF UK T-SQL procedury CREATE PROCEDURE INTEGER = NULL AS UPDATE Emp SET Sal Comm WHERE EXEC = = 15500; GO EXEC UpdEmpSal 4321, 14000, 500; GO

159 DBI026 -DB Aplikace - MFF UK PL/SQL funkce CREATE [OR REPLACE] FUNCTION jmfunc [(deklarace_parametru [, …])] RETURN typ {AS | IS} blok_bez_klíčového_slova_DECLARE; –Návrat hodnoty RETURN výraz; –Ukončí provádění funkce –Funkce vždy musí vrátit hodnotu. Pokud ne, generuje se výjimka –Volání funkce shodné s jakoukoli standardní funkcí SELECT jmfunc [(výraz [, …])] FROM …; –Parametry se předávají podle pořadí SELECT jmfunc [(jméno=>výraz [, …])] FROM …; –Parametry se předávají podle jména

160 DBI026 -DB Aplikace - MFF UK PL/SQL funkce CREATE FUNCTION Polynom2 ( x NUMBER, a NUMBER DEFAULT 0, b NUMBER DEFAULT 0, c NUMBER DEFAULT 0 ) RETURN NUMBER AS BEGIN RETURN (a*x+b)*x+c; END; / SELECT Polynom2(1, b=>2) FROM DUAL; -- 2*x, x=1, tj. 2 SELECT Polynom2(2, b=>3, c=>5) FROM DUAL; -- 3*x+5, x=2, tj. 11 SELECT Polynom2(2, 1, 1, 1) FROM DUAL; -- x2+x+1, x=2, tj. 7

161 DBI026 -DB Aplikace - MFF UK T-SQL funkce CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] RETURNS typ [AS] BEGIN … RETURN výraz; END [;] –Volání funkce shodné se standardní funkcí Závorky musí být i v případě fce bez parametrů SELECT jmfunc ([výraz [, …]]) FROM …; –Parametry se předávají podle pořadí SELECT jmfunc [, …]]) FROM …; –Parametry se předávají podle jména

162 DBI026 -DB Aplikace - MFF UK T-SQL funkce CREATE FUNCTION Polynom2 FLOAT = FLOAT = FLOAT = 0 ) RETURNS FLOAT AS BEGIN RETURN END; GO SELECT -- 2*x, x=1, tj *x+5, x=2, tj. 11 SELECT Polynom2(2, 1, 1, 1); -- x2+x+1, x=2, tj. 7

163 DBI026 -DB Aplikace - MFF UK T-SQL funkce vracející tabulku CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] RETURNS TABLE [AS] RETURN [(] SELECT …[)] –Použití jako pohled (tentokrát i s parametry) SELECT * FROM jmfunc ([výraz [, …]]);

164 DBI026 -DB Aplikace - MFF UK T-SQL funkce vracející tabulku CREATE FUNCTION jmfunc [(deklarace_parametru [, …])] TABLE (def. tabulky) [AS] BEGIN tělo, vkládající data do RETURN END [;] –Použití jako pohled (tentokrát i s parametry) SELECT * FROM jmfunc ([výraz [, …]]);

165 DBI026 -DB Aplikace - MFF UK Řídící příkazy - IF IF podmínka THEN příkazy IF [ELSIF podmínka THEN příkazy ELSIF1 [ELSIF podmínka THEN příkazy ELSIF2 …]] [ELSE příkazy ELSE ] END IF; Podmínka, vyhodnocená jako NULL je považována za nesplněnou IF podmínka příkaz IF | blok IF [ELSE příkaz ELSE | blok ELSE ] Podmínka, vyhodnocená jako NULL je považována za nesplněnou

166 DBI026 -DB Aplikace - MFF UK Řídící příkazy - WHILE WHILE podmínka LOOP … [EXIT WHEN podmínka] … END LOOP; While-cyklus s možným výskokem uprostřed WHILE podmínka příkaz WHILE | blok WHILE BREAK ukončí cyklus CONTINUE ukončí iteraci

167 DBI026 -DB Aplikace - MFF UK Řídící příkazy - LOOP LOOP … [EXIT WHEN podmínka] … END LOOP; Obecný cyklus s výskokem uprostřed Výskok je možné realizovat i pomocí IF podmínka THEN exit; END IF;

168 DBI026 -DB Aplikace - MFF UK Řídící příkazy - FOR FOR I IN LOOP … [EXIT WHEN podmínka] … END LOOP; FOR I IN REVERSE LOOP … END LOOP;

169 DBI026 -DB Aplikace - MFF UK Řídící příkazy - GOTO GOTO návěští; … > příkaz; Za návěštím musí být příkaz, alespoň prázdný příkaz NULL; GOTO návěští … návěští : …

170 DBI026 -DB Aplikace - MFF UK Řídící příkazy PL/SQL Pojmenované bloky > DECLARE … BEGIN … END [návěští]; Pojmenované cykly > LOOP … END LOOP [návěští]; Umožňují přistupovat na překryté proměnné kvalifikací jménem bloku Umožňují vyskakovat z více cyklů najednou: EXIT návěští WHEN …

171 DBI026 -DB Aplikace - MFF UK SELECT příkazy – PL/SQL SELECT výrazy INTO proměnné FROM … WHERE …; Musí vracet právě jednu řádku, jinak výjimka –NO_DATA_FOUND –TOO_MANY_ROWS DECLARE xEmpNo EMP.EmpNo%TYPE; xEName EMP.EName%TYPE; y Emp%ROWTYPE; BEGIN SELECT EmpNo, EName INTO xEmpNo, xEName FROM EMP WHERE EmpNo=1; SELECT * INTO y FROM EMP WHERE EmpNo=2; END;

172 DBI026 -DB Aplikace - MFF UK SELECT příkazy – T-SQL SELECT [, …] FROM … WHERE …; Musí vracet právě jednu řádku, jinak výjimka VARCHAR(30) = = EName FROM EMP WHERE EmpNo=1

173 DBI026 -DB Aplikace - MFF UK Víceřádkový SELECT - PL/SQL Víceřádkové SELECT příkazy bez INTO lze zpracovat jedině pomocí kurzorů Kurzory mají atributy, dostupné přes konstrukci kurzor%atribut –IsOpen BOOLEAN –Found BOOLEAN NotFound BOOLEAN –RowCount NUMBER DECLARE CURSOR C IS SELECT * FROM EMP; R C%RowType; BEGIN OPEN C; LOOP FETCH C INTO R; EXIT WHEN NOT C%Found; … END LOOP; CLOSE C; END;

174 DBI026 -DB Aplikace - MFF UK Víceřádkový SELECT – T-SQL Víceřádkové SELECT příkazy bez INTO lze zpracovat jedině pomocí kurzorů Po každém FETCH je nutné zkontrolovat –0 … v pořádku –-1 … za koncem kurzoru –-2 … řádka chybí DECLARE C CURSOR FOR SELECT * FROM EMP; OPEN C; FETCH NEXT FROM C; WHILE BEGIN … FETCH NEXT FROM C; END; CLOSE C; DEALLOCATE C;

175 DBI026 -DB Aplikace - MFF UK Víceřádkový SELECT - PL/SQL Jednodušší zpracování kurzorů nabízejí kurzorové FOR cykly DECLARE CURSOR C IS SELECT * FROM EMP; R C%RowType; BEGIN FOR R IN C LOOP … END LOOP; END; Automaticky deklarovaná proměnná, různá od té deklarované v bloku Tato proměnná se nepoužívá

176 DBI026 -DB Aplikace - MFF UK SELECT v PL/SQL Další možností je použití SELECT příkazu přímo v hlavičce FOR cyklu bez deklarace kurzoru DECLARE BEGIN FOR R IN ( SELECT * FROM EMP ) LOOP … END LOOP; END;

177 DBI026 -DB Aplikace - MFF UK Kurzory s parametry Deklarace –CURSOR C(J VARCHAR2, D NUMBER) IS SELECT * FROM EMP WHERE Job=J AND DeptNo=D; Použití –OPEN C(’Manager’,10); … CLOSE C; –FOR R IN C(’Manager’,10) LOOP … END LOOP;

178 DBI026 -DB Aplikace - MFF UK Kurzory Deklarace –C [SCROLL] CURSOR FOR SELECT …; Získání dat –FETCH {NEXT | PRIOR | ABSOLUTE n | RELATIVE n | LAST | FIRST} FROM C [, …]] –Pokud kurzor není deklarovaný s klíčovým slovem SCROLL, je možné použít jen NEXT

179 DBI026 -DB Aplikace - MFF UK Výjimky Slouží k ošetření výjimečných stavů při vykonávání SQL příkazů K výjimkám dochází velmi často Je nutné je korektně obsloužit

180 DBI026 -DB Aplikace - MFF UK Výjimky Typy výjimek –Určené k ošetření na serveru či v klientské aplikaci Standardní pojmenované výjimky –Generované serverem, mají přidělené jméno Standardní nepojmenované výjimky –Generované serverem, nemají přidělené jméno –Určené k ošetření na serveru Uživatelské vnitřní výjimky –Definované uživatelem, mají jméno, nemají popis –Určené k ošetření v klientské aplikaci Uživatelské aplikační výjimky –Definované uživatelem, nemají jméno, mají popis

181 DBI026 -DB Aplikace - MFF UK Standardní pojmenované výjimky Základní výjimky –NO_DATA_FOUND –TOO_MANY_ROWS –DUP_VAL_ON_INDEX –INVALID_NUMBER –ZERO_DIVIDE Zachytávání –EXCEPTION WHEN jm1 [OR jm2 …] THEN příkazy; [WHEN jm3 [OR …] THEN příkazy;] [WHEN OTHERS THEN příkazy;] Blok nezachytí výjimky generované v jeho deklarační části –DECLA RE x NUMBER := 0; y NUMBER := 1/x; /* ZERO_DIVIDE !! */ Ty jsou zachyceny nejdříve o úroveň výše Zachytí jakoukoli dosud neobslouženou výjimku

182 DBI026 -DB Aplikace - MFF UK Uživatelské vnitřní výjimky Deklarace –DECLARE X EXCEPTION; … Generování –RAISE X; Zachytávání –EXCEPTION [WHEN X THEN …;] WHEN OTHERS …; Problém předefinování – > DECLARE X EXCEPTION; BEGIN > DECLARE X EXCEPTION; BEGIN RAISE X; END Vnitrni; EXCEPTION WHEN X THEN …; END Vnejsi; Jiné – Vnejsi.X  neošetří Vnitrni.X X neošetřeno, propaguje se výš

183 DBI026 -DB Aplikace - MFF UK Standardní nepojmenované výjimky Vlastní pojmenování –DECLARE X EXCEPTION; PRAGMA EXCEPTION_INIT(X,-54) /* ORA ~ Resource locked */ Zachytávání –EXCEPTION WHEN X THEN …; –EXCEPTION WHEN OTHERS THEN …; Opětovné vyvolání jakékoli obsloužené výjimky, pokud se má obsloužit i ve vyšších úrovních –EXCEPTION … WHEN … THEN … RAISE;

184 DBI026 -DB Aplikace - MFF UK Uživatelské aplikační výjimky Generování –RAISE_APPLICATION_ERROR( , -- číslo výjimky  ’Popis’, -- text vysvětlující příčinu ); Pokud se přidá třetí parametr FALSE, výjimka se pouze uloží na zásobník výjimek, ale běh se nepřeruší. To umožňuje vrátit více výjimek, kdy spodní je příčinou té horní

185 DBI026 -DB Aplikace - MFF UK Výjimky - příklad CREATE PROCEDURE InsEmp ( xEmpNo NUMBER, xEName VARCHAR2, xSal NUMBER DEFAULT NULL) AS xS NUMBER; BEGIN xS := xSal; IF xS IS NULL THEN SELECT MIN(Sal) INTO xS FROM EMP; END IF; INSERT INTO Emp(EmpNo,EName,Sal) VALUES(xEmpNo,xEName,xS); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN RAISE_APPLICATION_ERROR( , ’Zaměstnanec ’||xEmpNo||’ již existuje!’ ); END; / EXEC InsEmp(1234,’Novák’);

186 DBI026 -DB Aplikace - MFF UK Výjimky – T-SQL BEGIN TRY příkaz END TRY BEGIN CATCH příkaz END CATCH Funkce pro identifikaci chyb –ERROR_NUMBER() –ERROR_SEVERITY() –ERROR_STATE() –ERROR_PROCEDURE() –ERROR_LINE() –ERROR_MESSAGE()

187 DBI026 -DB Aplikace - MFF UK Výjimky – T-SQL BEGIN TRY příkaz END TRY BEGIN CATCH příkaz END CATCH Zachyceny nejsou –Varování s ERROR_SEVERITY<=10 –Chyby s ERROR_SEVERITY>20 pokud zastavují vykonávání pro session O úroveň výše zachyceny –Kompilační chyby

188 DBI026 -DB Aplikace - MFF UK Výjimky – T-SQL BEGIN TRY SELECT 1/0; -- zero divide … END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage; END CATCH; GO

189 DBI026 -DB Aplikace - MFF UK Uživatelské aplikační výjimky Generování –RAISERROR({ msg_id -- číslo výjimky, >= | msg_str -- text výjimky -- text výjimky v proměnné }, severity, state, argument [, …]) Jednotlivé zprávy lze předpřipravit pomocí sp_addmessage a poté se odkazovat jen pomocí msg_id msg_str může obsahovat odkazy na parametry, podobně jako C-funkce printf, hodnoty předány v argumentech Severity je závažnost chyby pouze skup. sysadmin

190 Zabezpečení dat Triggery, práva Přednáška č. 4

191 DBI026 -DB Aplikace - MFF UK Triggery - aktivní databáze Speciální typ uložené procedury –Aktivují se automaticky při splnění nějaké podmínky na serveru Aktualizace dat (zde popsané) Události spojené s DB nebo session –Přihlášení, vytvoření/zrušení tabulky atd –Mění databázi na aktivní databázi Aktivní pravidla typu Událost  Podmínka  Akce

192 DBI026 -DB Aplikace - MFF UK Triggery - aktivní databáze Pravidla Událost  Podmínka  Akce –Událost … změna dat (INSERT/UPDATE/DELETE) –Podmínka … měněná data odpovídají podmínce, vyjádřené Boolským SQL výrazem –Akce … Provede se příslušná akce, obsahující další příkazy INSERT/UPDATE/DELETE...

193 DBI026 -DB Aplikace - MFF UK Triggery - aktivní databáze Podrobnější pravidla než integritní omezení Implementovány přímo v databázi Aplikují se shodně pro všechny aplikace Aktivní databáze umožňuje lépe zajistit integritu dat a jejich zpracování, než databáze pasivní

194 DBI026 -DB Aplikace - MFF UK Pojmenovávání triggerů Triggery (pravidla) mohou být pojmenovány libovolným identifikátorem Je vhodné jména konstruovat systematicky tak, aby bylo poznat, ke které tabulce se vztahují, na jakou operaci reagují a další pomocné informace

195 DBI026 -DB Aplikace - MFF UK Typy triggerů Dva typy triggerů (pravidel aktivní DB) –Řádkové aktivují se změnou jednotlivých řádek pokud se mění více řádek, aktivují se pro každou z nich zvlášť –Příkazové aktivují se spuštěním příkazu daného typu pro jeden příkaz se aktivují jen jednou bez ohledu na počet měněných řádek

196 DBI026 -DB Aplikace - MFF UK Použití tabulkových triggerů Detailní ověření dat v tabulce, nedosažitelné pomocí integritních omezení –Typicky BEFORE row-level triggery Ověření oprávnění provést danou operaci –Typicky BEFORE statement-level triggery Žurnálování starých hodnot tabulky –Typicky AFTER row-level triggery Žurnálování historie operací nad tabulkou –Typicky AFTER statement-level triggery Replikace dat

197 DBI026 -DB Aplikace - MFF UK Nevhodná použití triggerů Suplování aplikační logiky –Část aplikační logiky je „skrytá“ před aplikací –Změny v datech mají nečekané vedlejší efekty –Horší ladění aplikace Pro tento účel je vhodnější použít procedury, které aplikace může (nebo musí, protože nemůže měnit data přímo) explicitně zavolat

198 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – PL/SQL CREATE [OR REPLACE] TRIGGER jm_triggeru {BEFORE | AFTER} {INSERT | DELETE | UPDATE [OF sloupec]} ON jm_tabulky [FOR EACH ROW] [REFERENCING OLD AS jm_old NEW AS jm_new] [WHEN (podmínka)] blok kódu PL/SQL; Definují, co se má provést před, resp. po změně dat v DB Row-level triggery se opakují pro každý řádek, ostatní (statement-level) triggery pro příkaz jako celek

199 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – PL/SQL Aktualizace tabulky se provede takto: 1. BEFORE statement-level triggery 2. BEFORE row-level triggery 3. Aktualizace řádky 4. AFTER row-level triggery 5. AFTER statement-level triggery Pokud kterýkoli krok selže, tj. vrátí neošetřenou výjimku, aktualizace je neplatná Může být definováno více triggerů stejného typu, ale není pro ně definováno relativní pořadí

200 DBI026 -DB Aplikace - MFF UK Tabulkové triggery –T-SQL CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [, ] [ UPDATE ] [, ] [ DELETE ] } [ WITH APPEND ] AS [{IF UPDATE ( column ) [{ AND | OR } UPDATE ( column ) ] … | IF ( COLUMNS_UPDATED ( bitwise_operator updated_bitmask )}] sql_statement [...]

201 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – T-SQL Aktualizace tabulky se provede takto: 1. Kontrola integritních omezení 2. Vytvoření tabulek deleted a updated 2. Aktualizace / INSTEAD OF trigger 3. AFTER triggery Pokud je operace shledána nekorektní, je možné transakci odrolovat pomocí ROLLBACK TRANSACTION V MS SQL 6.5 je pro možnost vytváření více triggerů stejného typu nutné přidat WITH APPEND klauzuli. V MS SQL 7.0+ je tato klauzule již označována za OBSOLETE. Pořadí vykonávání triggerů je možné definovat pomocí procedury sp_settriggerorder

202 DBI026 -DB Aplikace - MFF UK Triggery Typy aktualizací lze spojovat v rámci jediného triggeru –V Oracle pomocí OR CREATE TRIGGER … BEFORE INSERT OR UPDATE ON … V těle triggerů definovány booleovské predikáty INSERTING, UPDATING, DELETING –V MS SQL pomocí oddělení čárkou CREATE TRIGGER … ON … FOR INSERT, UPDATE

203 DBI026 -DB Aplikace - MFF UK Tabulkové triggery INSTEAD OF triggery slouží pro definici vlastního postupu aktualizace dat –Spouští se místo standardních operací INSERT, UPDATE, DELETE –V Oracle jsou povolené pouze nad pohledy, ostatní pouze nad tabulkami –MS SQL tabulky a pohledy v tomto směru nerozlišuje

204 DBI026 -DB Aplikace - MFF UK Tabulkové triggery Scénář I: Ověření práva na provedení operace –Spouští se obvykle před provedením příkazu, a nekontrolují měněná data Mohou zjistit, zda je uživatel přihlášen ze správného terminálu, zda provádí operaci ve vyhrazeném čase (pracovní době), a řadu dalších kontrol, nedostupných pomocí integritních omezení

205 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – PL/SQL Např.: –CREATE OR REPLACE TRIGGER bef_ins_Emp BEFORE INSERT ON Emp BEGIN IF USERENV(’TERMINAL’) NOT LIKE ’PERS%’ THEN RAISE_APPLICATION_ERROR( , ’Zaměstnance lze přijímat pouze na personálním oddělení’ ); END IF; END; /

206 DBI026 -DB Aplikace - MFF UK Tabulkové triggery Scénář II: Doplnění funkčně závislých hodnot do jednotlivých řádek –Provádí se před provedením operace na každé řádce

207 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – PL/SQL V rámci row-level triggerů jsou definovány dva záznamy NEW a OLD obsahující data před změnou a po ní –INSERT triggery jen NEW –DELETE triggery jen OLD –UPDATE triggery obojí Jména lze změnit pomocí klauzule REFERENCING

208 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – PL/SQL Např.: –CREATE OR REPLACE TRIGGER bef_ins_Emp_row BEFORE INSERT ON Emp FOR EACH ROW BEGIN -- přidáni umělého klíče IF :NEW.EmpNo IS NULL THEN -- doplnění čísla zaměstnance ze sekvence SELECT SeqEmpNo.nextval INTO :NEW.EmpNo -- před NEW a OLD se píše dvojtečka FROM DUAL; END IF; END; /

209 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – PL/SQL Spuštění triggeru může být podmíněno splněním podmínky uvedené v klauzuli WHEN –CREATE OR REPLACE TRIGGER bef_ins_Emp_row BEFORE INSERT ON Emp FOR EACH ROW WHEN (NEW.EmpNo IS NULL) -- ve WHEN klauzuli se před NEW a OLD dvojtečka nepíše BEGIN SELECT SeqEmpNo.nextval INTO :NEW.EmpNo FROM DUAL; END; /

210 DBI026 -DB Aplikace - MFF UK Tabulkové triggery – T-SQL V rámci triggerů jsou definovány dvě pseudo-tabulky inserted a deleted, obsahující nové a staré verze záznamů

211 DBI026 -DB Aplikace - MFF UK Tabulkové triggery Scénář III: Kontrola vkládaných dat. –Provádí se před provedením operace na každé řádce

212 DBI026 -DB Aplikace - MFF UK Triggery PL/SQL Např.: –CREATE OR REPLACE TRIGGER bef_ins_upd_Emp_row BEFORE UPDATE ON Emp FOR EACH ROW BEGIN IF :NEW.Sal > :OLD.Sal * 1.1 THEN RAISE_APPLICATION_ERROR( ,’Plat může být zvýšen maximálně o 10%.’ ); END IF; END;

213 DBI026 -DB Aplikace - MFF UK Tabulkové triggery Scénář IV: Kontrola vkládaných dat, doplnění závislých hodnot v MS SQL. –Nutno provést až po aktualizační operaci s využitím tabulek deleted a inserted.

214 DBI026 -DB Aplikace - MFF UK Triggery T-SQL Např. –CREATE TRIGGER employee_insupd ON emp FOR INSERT, UPDATE AS smallint = = i.job_id FROM emp AS e INNER JOIN inserted i ON e.emp_id = i.emp_id JOIN jobs j ON j.job_id = i.job_id IF = 1) and <> 10) BEGIN RAISERROR ('Job id 1 expects the default level of 10.', 16, 1) ROLLBACK TRANSACTION END

215 DBI026 -DB Aplikace - MFF UK Triggery T-SQL Např. –CREATE TRIGGER employee_insupd ON emp FOR INSERT, UPDATE AS BEGIN UPDATE e SET empname = upper(empname) FROMemp AS e JOIN inserted i ON e.emp_id = i.emp_id WHERE UPDATED(empname) END

216 DBI026 -DB Aplikace - MFF UK Tabulkové triggery Scénář V: Žurnálování změn v tabulce. –Vhodné provést až po úspěšné aktualizační operaci. –Je možné zapamatovat si původní i novou hodnotu, čas aktualizace, jejího autora a podobně

217 DBI026 -DB Aplikace - MFF UK Triggery PL/SQL Např.: –CREATE OR REPLACE TRIGGER aft_upd_Emp_row AFTER UPDATE ON Emp FOR EACH ROW WHEN (OLD.Sal <> NEW.Sal) BEGIN INSERT INTO Zurnal(Kdo, Kdy, Puvodni, Novy) VALUES(USER, SYSDATE, :OLD.Sal, :NEW.Sal); END;

218 DBI026 -DB Aplikace - MFF UK Triggery T-SQL Např.: –CREATE TRIGGER aft_upd_Emp ON employee FOR UPDATE AS BEGIN INSERT INTO Zurnal(Kdo, Kdy, Puvodni, Novy) SELECT CURRENT_USER, CURRENT_DATE, d.Sal, e.Sal FROM deleted AS d JOIN employee AS e ON d.emp.id=e.emp_id WHERE UPDATED(Sal); END;

219 DBI026 -DB Aplikace - MFF UK Triggery na pohledech – PL/SQL CREATE [OR REPLACE] TRIGGER jm_triggeru INSTEAD OF {INSERT | DELETE | UPDATE [OF sloupec]} ON jm_pohledu FOR EACH ROW [REFERENCING OLD AS jm_old NEW AS jm_new] [WHEN (podmínka)] blok kódu PL/SQL; Definují, jak se má provést změna dat v DB

220 DBI026 -DB Aplikace - MFF UK Datový slovník Pohledy –USER_TRIGGERS –USER_SOURCE Pohledy –SYS.TRIGGERS –SYS.TRIGGER_EVENTS

221 DBI026 -DB Aplikace - MFF UK Práva k objektům v SQL Standardně má každý uživatel přístup jen k datům ve svém schématu Přístup k dalším objektům je nutné explicitně povolit pomocí příkazu GRANT, případně opětovně zakázat pomocí příkazu REVOKE

222 DBI026 -DB Aplikace - MFF UK Práva k objektům v SQL Standardně má každý uživatel přístup jen k datům ve svém schématu Přístup k dalším objektům je nutné explicitně povolit pomocí příkazu GRANT, případně opětovně zakázat pomocí příkazu REVOKE

223 DBI026 -DB Aplikace - MFF UK Práva k objektům v SQL GRANT GRANT {ALL [PRIVILEGES] | právo [, …]} ON objekt TO {PUBLIC | uživatel | skupina } [, …] [WITH GRANT OPTION]

224 DBI026 -DB Aplikace - MFF UK Práva k objektům v SQL GRANT Práva: –SELECT –INSERT –UPDATE –ALTER –EXECUTE –… WITH GRANT OPTION –Nabyvatel práv může tyto práva dále propůjčovat –Pokud tento uživatel o právo v budoucnosti přijde, odebere se i těm, kterým ho propůjčil

225 DBI026 -DB Aplikace - MFF UK Práva a role GRANT SELECT, INSERT ON Zamestnanec TO SCOTT; GRANT ALL EXCEPT DROP ON Oddeleni TO SCOTT WITH GRANT OPTION; GRANT SELECT ON Zamestnanec TO PUBLIC; SCOTT může číst a doplňovat data v mé tabulce Zamestnanec SCOTT nemůže tabulku zrušit, ale může propůjčovat svá práva dalším Kdokoli může číst data

226 DBI026 -DB Aplikace - MFF UK Práva a role CREATE ROLE Student; GRANT Student TO Novak; GRANT SELECT ON Emp TO Student; CREATE ROLE Seminar [IDENTIFIED BY heslo]; GRANT UPDATE, INSERT ON Emp TO Seminar; GRANT Student TO Seminar; Vytvoř roli Zařaď Nováka mezi studenty Všichni studenti mohou číst data z tabulky Emp Další (zaheslovaná) role Účastníci semináře mohou data měnit a vytvářet Účastníci semináře jsou zároveň studenty

227 DBI026 -DB Aplikace - MFF UK Práva k objektům v SQL V databázi může díky WITH GRANT OPTION existovat více než jedna cesta, která propůjčuje uživateli nějaké právo na daný objekt. Uživatel je oprávněn danou operaci provádět, dokud existuje alespoň jedna taková cesta

228 DBI026 -DB Aplikace - MFF UK Práva a role KOPECKY SCOTT.Emp SCOTT ALL Seminar Student SELECT UPDATE INSERT ALL WITH G.O. NOVAK UPDATE DELETE WITH G.O.

229 DBI026 -DB Aplikace - MFF UK Využití práv přístupu Díky právům je možné zcela oddělit uživatele, který data vlastní (a může s nimi provádět cokoli včetně zrušení tabulek) od uživatel, kteří s daty pracují v klientských aplikacích Uživatelé se mohou hlásit pod jiná schémata a pracovat s daty, které jim nepatří. –Mohou tak provádět pouze operace, které jim vlastník explicitně povolil –Nemohou například deaktivovat triggery a integritní omezení

230 DBI026 -DB Aplikace - MFF UK Práva k objektům v SQL REVOKE REVOKE {ALL [PRIVILEGES] | právo [, …]} ON objekt FROM {PUBLIC | uživatel | skupina } [, …]

231 DBI026 -DB Aplikace - MFF UK Přístup k cizím objektům Prostřednictvím tečkové notace –název_schematu.název_objektu

232 DBI026 -DB Aplikace - MFF UK Přístup k datům pomocí procedur, funkcí a triggerů Procedury, funkce a triggery se standardně vykonávají pod uživatelem, který je definoval (obdoba propůjčení identity v OS UNIX/Linux) –To je vhodné pro odstínění uživatele od tabulek, se kterými se manipuluje Uživatel, který je spouští, nemusí mít práva pro manipulaci s tabulkami

233 DBI026 -DB Aplikace - MFF UK Přístup k datům pomocí procedur, funkcí a triggerů V některých případech je potřebné, aby se procedura vykonávala s právy uživatele, který ji spouští –V Oracle pomocí klauzule AUTHID {CURRENT_USER|DEFINER} CURRENT_USER ~ s právy uživatele, volajícího fci, proceduru, … DEFINER ~ s právy toho, kdo proceduru vlastní –V MS SQL pomocí klauzule EXECUTE AS {CALLER|SELF|OWNER|’username’} CALLER ~ s právy uživatele, volajícího fci, proceduru, … SELF ~ s právy toho, kdo proceduru vytvořil OWNER ~ s právy toho, kdo proceduru vlastní ’username’ ~ s právy daného uživatele

234 DBI026 -DB Aplikace - MFF UK Přístup k datům pomocí procedur, funkcí a triggerů Např. –CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER AS …; –CREATE OR REPLACE FUNCTION f RETURN NUMERIC AUTHID CURRENT_USER AS …;

235 DBI026 -DB Aplikace - MFF UK Přístup k datům pomocí procedur, funkcí a triggerů Např. –CREATE PROCEDURE p AS … EXECUTE AS … –CREATE FUNCTION f RETURNS NUMERIC AS … EXECUTE AS …

236 DBI026 -DB Aplikace - MFF UK Provedení operace v nezávislé transakci Některé operace je vhodné provést nezávisle na to, zda se podaří či nepodaří aktualizace, se kterou je operace svázána –Např. vhodné pro žurnálování pokusů o provedení nedovolené operace, které se odporují integritním omezením, a proto se neuloží. –V Oracle pomocí PRAGMA AUTONOMOUS_TRANSACTION v deklaraci bloku

237 DBI026 -DB Aplikace - MFF UK Provedení operace v nezávislé transakci Např. –CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER AS PRAGMA AUTONOMOUS_TRANSACTION; …;

238 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Je nutné mít na paměti, že databázová aplikace nad daty neběží obvykle sama Většinou běží nad daty několik (desítek, stovek) instancí téže aplikace, případně různé aplikace, pracující se stejnými daty Je nutné, aby aplikace běžela korektně i v paralelním režimu!

239 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Kontroly by měly být prováděny „co nejblíže“ k uloženým datům –Co lze provést pomocí definic integritních omezení, definovat s jejich pomocí –Co lze následně provést pomocí triggerů, provést pomocí triggerů Kontroly, aktualizace závislých hodnot v databázi, … –Procedury a funkce pro manipulaci s daty

240 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Hlídání unikátnosti sloupce jinak než pomocí UNIQUE / PRIMARY KEY nebude pravděpodobně fungovat Posloupnost SELECT COUNT(*) FROM … IF /* řádka neexistuje */ INSERT INTO … nemusí jít spustit paralelně, obě transakce mohou nejprve zjistit počet a potom obě zapsat stejnou řádku

241 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Stupně izolace transakcí dle ANSI SQL –READ UNCOMMITED Může nastat: Dirty read, Nonrepeatable Read, Phantom Read –READ COMMITED Může nastat: Nonrepeatable Read, Phantom Read –REPEATABLE READ Může nastat: Phantom Read –SERIALIZABLE

242 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Dirty read - READ UNCOMMITED (transakce vidí data, změněná, ale nepotvrzená, jinou transakcí) –Transakce 1Transakce 2 UPDATE Ucet /* > 10100*/ SET Zustatek = Zustatek*1.01 WHERE Cis_Uctu = ´ ´; SELECT Zustatek /*10100*/ FROM Ucet WHERE Cis_Uctu = ´ ´; ROLLBACK;

243 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Non-repeatable read - READ UNCOMMITED, READ COMMITED (transakce čte stejná data vícekrát, pokaždé s jinou hodnototu) –Transakce 1Transakce 2 SELECT Zustatek /*10000*/ FROM Ucet WHERE Cis_Uctu = ´ ´; UPDATE Ucet /* > 10100*/ SET Zustatek = Zustatek*1.01 WHERE Cis_Uctu = ´ ´; COMMIT; SELECT Zustatek /*10100*/ FROM Ucet WHERE Cis_Uctu = ´ ´;

244 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Phantom read - READ UNCOMMITED, READ COMMITED, REPEATABLE READ (transakce provádí SELECT vícekrát, pokaždé s jinou výslednou množinou) –Transakce 1Transakce 2 SELECT * /*Bez ´ ´*/ FROM Ucet WHERE Typ_Uctu = ´Běžný´; INSERT INTO Ucet VALUES(´ ´, ´Běžný´); COMMIT; SELECT * /*Včetně ´ ´*/ FROM Ucet WHERE Typ_Uctu = ´Běžný´;

245 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE Dirty readNon-repeatable readPhantom read       READ UNCOMMITED READ COMMITED REPEATABLE READ SERIALIZABLE Read lockWrite lockRange lock   

246 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Oracle standardně garantuje pouze konzistenci na úrovni příkazů, ekvivalentní nastavení SET TRANSACTION ISOLATION LEVEL READ COMMITED Lze nastavit přísnější kontrolu SET TRANSACTION ISOLATION LEVEL SERIALIZABLE která se ale hodí pouze pro krátké transakce

247 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim MS SQL podporuje všechny úrovně izolace Ve verzi 6.5 je REPEATABLE READ shodná s přísnější variantou SERIALIZABLE Od verze 7.0 jsou díky existenci řádkových zámků obě úrovně rozlišené

248 Transakce Přednáška č. 5

249 DBI026 -DB Aplikace - MFF UK Transakční zpracování Dovoluje uzavírat více logicky souvisejících příkazů do jediné atomické operace –SŘBD zajistí, aby se provedly a permanentně uložily výsledky všech příkazů, nebo žádný z nich –Příkazy dle SQL-92 COMMIT [WORK] … potvrzení transakce ROLLBACK [WORK] … odvolání transakce

250 DBI026 -DB Aplikace - MFF UK Transakční zpracování Na konci každé transakce musí být databáze v konzistentním stavu –Integritní omezení se standardně kontrolují po každé operaci –Integritní omezení má dva příznaky: DEFERRABLE a DEFERRED [CONSTRAINT jméno] definice_omezení [INITIALLY {DEFERRED|IMMEDIATE}] [[NOT] DEFERRABLE] –Pokud jsou oba příznaky zapnuté, kontrola se provádí při COMMITu. Pokud nejsou splněny, provede se ROLLBACK

251 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Oracle automaticky zahajuje transakce, jakmile je předchozí transakce ukončena. Transakce nemohou být hnízděné (Procedury, funkce a triggery mohou běžet v samostatných nezávislých transakcích)

252 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim MS SQL dovoluje rovněž syntaxi COMMIT TRANSACTION [name|:var] ROLLBACK TRANSACTION [name|:var] pro ukončení transakce, začaté příkazem BEGIN TRANSACTION [name|:var] Transakce mohou být hnízděné

253 DBI026 -DB Aplikace - MFF UK Transakční zpracování Bod zotavení (SAVEPOINT) –V rámci transakce je možné vytvářet pojmenované kontrolní body, které slouží k částečnému odvolávání transakcí –Vhodné např. pokud je potřeba nějakou část transakce při neúspěchu zopakovat, s možností zachování předcházejících operací v transakci beze změny S1

254 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim Oracle používá standardní syntaxi SAVEPOINT name; ROLLBACK [WORK] TO SAVEPOINT name;

255 DBI026 -DB Aplikace - MFF UK Víceuživatelský režim MS SQL používá syntaxi SAVE TRANSACTION name|:var ROLLBACK TRANSACTION name|:var

256 Explicitní zamykání Přednáška č. 6

257 DBI026 -DB Aplikace - MFF UK Explicitní zamykání Za běžných okolností provádí zamykání řádek v tabulkách databázový server sám na základě nastavení úrovně izolace příkazem SET TRANSACTION ISOLATION LEVEL V některých případech je potřebné či žádoucí zamknout některé řádky či celé tabulky explicitně

258 DBI026 -DB Aplikace - MFF UK Explicitní zamykání Kdy zamykat tabulky –před provedením hromadných aktualizací dat v tabulce či tabulkách migrace na jinou strukturu dat hromadné zpracování dat na přelomu roku inventury... –lze použít rovněž jako synchronizační prvek (semafor) pro vzájemné vyloučení více klientů v kritické sekci aplikace

259 DBI026 -DB Aplikace - MFF UK Explicitní zamykání Kdy zamykat řádky –Například řádka v nadřízené tabulce při manipulaci s podřízenými řádkami Zabránění současné manipulace s daty více transakcemi

260 DBI026 -DB Aplikace - MFF UK Explicitní zamykání v Oracle Uzamknutí řádek získaných SELECT příkazem v exkluzivním režimu –SELECT …FOR UPDATE [NOWAIT]; Pokud je uvedeno NOWAIT, Oracle vrací výjimku ORA DECLARE UZAMKNUTO EXCEPTION; PRAGMA EXCEPTION_INIT(UZAMKNUTO,-54); BEGIN … EXCEPTION WHEN UZAMKNUTO THEN …; END;

261 DBI026 -DB Aplikace - MFF UK Explicitní zamykání v Oracle Uzamknutí řádek získaných SELECT příkazem v exkluzivním režimu –SELECT …FOR UPDATE [NOWAIT]; Pokud není uvedeno NOWAIT, transakce je zablokována do uvolnění zámku ostatními transakcemi. Může dojít k deadlocku. V takovém případě je v některé z transakcí generována výjimka ORA-00060

262 DBI026 -DB Aplikace - MFF UK Explicitní zamykání v MS SQL Uzamknutí stránek/řádek získaných SELECT příkazem: –BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); NOLOCK … nevytvářet sdílený z., ignorovat exist. z. HOLDLOCK … ponechat sdílený z. do konce transakce UPDLOCK … vytvořit aktualizační zámek do konce transakce READ[UN]COMMITTED, REPEATABLEREAD, SERIALIZABLE … stejná sémantika jako při odpovídajícím nastavení transakce

263 DBI026 -DB Aplikace - MFF UK Explicitní zamykání v MS SQL Uzamknutí stránek/řádek získaných SELECT příkazem: –BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); READPAST … vynechá zamčené řádky ROWLOCK … jemnější řádkové z. místo (defaultních) stránkových zámků PAGLOCK … defaultní stránkové zamykání

264 DBI026 -DB Aplikace - MFF UK Explicitní zamykání v Oracle Uzamknutí tabulky možné jak v exkluzivním, tak sdíleném režimu. Ve sdíleném režimu může tabulku souběžně uzamknout více transakcí. Číst data z tabulky mohou číst i ostatní transakce. LOCK TABLE t IN {SHARED | EXCLUSIVE} MODE [NOWAIT];

265 DBI026 -DB Aplikace - MFF UK Explicitní zamykání v MS SQL Uzamknutí stránek/řádek získaných SELECT příkazem: –BEGIN TRAN[SACTION] SELECT …WITH (požadavky_na_zamykání); TABLOCK … sdílený zámek na celé tabulce do konce příkazu, spolu s HOLDLOCK do konce transakce TABLOCKX … exkluzivní zámek na celé tabulce do konce příkazu, spolu s HOLDLOCK do konce transakce

266 DBI026 -DB Aplikace - MFF UK Odemknutí zámků Odemyká se pouze implicitně současně s ukončením transakce –COMMIT; Změny se potvrdí a zámky uvolní –ROLLBACK; Změny se odvolají a zámky uvolní –ROLLBACK TO SAVEPOINT jméno; resp. ROLLBACK TRANSACTION jméno|:proměnná Odvolá změny v Oracle, resp. MS SQL od uvedené značky a uvolní odpovídající zámky

267 DBI026 -DB Aplikace - MFF UK Použití zámků v Oracle DECLARE CURSOR C(d NUMBER) IS SELECT * FROM Emp WHERE DeptNo=d FOR UPDATE NOWAIT; UZAMKNUTO EXCEPTION; PRAGMA EXCEPTION_INIT(UZAMKNUTO,-54); BEGIN FOR I IN LOOP BEGIN FOR R IN C(10) LOOP … END LOOP; EXIT; -- Úspěšný pokus EXCEPTION WHEN UZAMKNUTO THEN NULL; END; END LOOP; END;

268 DBI026 -DB Aplikace - MFF UK Použití zámků v MS SQL BEGIN TRANS = COUNT(*) FROM tbl WITH ( TABLOCK, UPDLOCK, HOLDLOCK )

269 Množinové operace, UNION [ALL], INTERSECT, EXCEPT

270 DBI026 -DB Aplikace - MFF UK Množinové operace SQL Pro množinové operace jsou v ANSI SQL definovány tři operátory –UNION [ALL] SELECT … FROM … WHERE … UNION ALL SELECT … FROM … WHERE … UNION ALL … Pokud není uvedeno ALL, obsahuje výsledek unikátní řádky, jinak se jen výsledky spojí za sebe Unikátní UNION vyžaduje třídění a slévání výsledků, pokud je to možné, je žádoucí se mu vyhnout –INTERSECT Průnik výsledků dvou a více SELECT příkazů –EXCEPT (Oracle používá vlastní operátor MINUS)

271 Příkaz WITH, Rekurzivní dotazy

272 DBI026 -DB Aplikace - MFF UK Rekurzivní dotazy a SQL Standardní SQL obsahuje podporu pro rekurzi od verze ANSI SQL-99 v příkazu WITH –Oracle podporuje od verze 9i release 2 omezenou sémantiku bez podpory rekurze –MS SQL podporuje od verze MS SQL Server 2005 Oracle SQL pro rekurzi obsahuje proprietární řešení (s omezenějšími možnostmi) s pomocí speciálních klauzulí START WITH a CONNECT BY příkazu SELECT

273 DBI026 -DB Aplikace - MFF UK Příkaz WITH WITH t1[(c11[,…])] AS (SELECT …) [,t2[(c21[,…])] AS (SELECT …) SELECT … FROM t1, t2, … –Konstrukt WITH definuje zdroje t1, t2, … ze kterých se data vybírají –Definice zdroje se může (a nemusí) odkazovat na svojí vlastní definici, či definice předchozích zdrojů v příkazu WITH –SELECT se může a nemusí odkazovat na zdroje

274 DBI026 -DB Aplikace - MFF UK Příkaz WITH Příklad: Nejvyšší počet zaměstnanců v jednom oddělení –WITH x AS ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID) SELECT MAX(Poc) FROM x;

275 DBI026 -DB Aplikace - MFF UK Příkaz WITH S použitím WITH WITH x AS ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID ) SELECT MAX(Poc) FROM x; Bez použití WITH SELECT MAX(Poc) FROM ( SELECT OddID, COUNT(*) AS Poc FROM Zamestnanec GROUP BY OddID ) x

276 DBI026 -DB Aplikace - MFF UK Rekurzivní dotazy a SQL Příklad: Tabulka Zamestnanec s následující strukturou: ZamID … ID zaměstnance Jmeno … Jméno zaměstnance VedID … ID přímého nadřízeného Je potřeba vypsat zaměstnance spolu s informací, na jaké úrovni řízení jsou zaměstnáni. Zaměstnanci bez vedoucích jsou na první úrovni

277 DBI026 -DB Aplikace - MFF UK Rekurzivní dotazy a SQL Příklad: WITH z AS ( SELECT Jmeno, 0 AS Uroven FROM Zamestnanec x WHERE VedID IS NULL UNION ALL SELECT Jmeno, Uroven+1 AS Uroven FROM Zamestnanec y JOIN z ON y.VedID=z.ZamID ) SELECT * FROM z;

278 DBI026 -DB Aplikace - MFF UK Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Řádky vyhovující podmínce ve START WITH jsou považovány za kořenové řádky na první úrovni vnoření

279 DBI026 -DB Aplikace - MFF UK Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Pro každou řádku na úrovni i se rekurzivně hledají přímí potomci vyhovující podmínce v klauzuli CONNECT BY na úrovni i+1 Řádka předka se v podmínce označuje klíčovým slovem PRIOR

280 DBI026 -DB Aplikace - MFF UK Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [ORDER BY …] Na závěr jsou odstraněny řádky nevyhovující podmínce ve WHERE

281 DBI026 -DB Aplikace - MFF UK Stromy v Oracle SQL SELECT sloupce FROM tabulka [WHERE podmínka3] START WITH podmínka1 CONNECT BY podmínka2 [NOCYCLE] [ORDER BY …] Pokud není definováno třídění, odpovídá pořadí průchodu pre-order Každý řádek obsahuje pseudo-sloupec LEVEL, obsahující úroveň řádku v hierarchii

282 DBI026 -DB Aplikace - MFF UK Rekurzivní dotazy a SQL Příklad: SELECT Jmeno, Level AS Uroven FROM Zamestnanec z START WITH VedID IS NULL CONNECT BY PRIOR ZamID = VedID; SELECT -- s odsazením dle úrovně LPAD(‘ ‘,2*Level)||Jmeno AS Jmeno, …

283 CASE výrazy

284 DBI026 -DB Aplikace - MFF UK Podmíněné výrazy V řadě případů je potřeba hodnotu výrazu podřídit nějakému větvícímu se rozhodování –význam dle číselníku 1 ~ pondělí … 7 ~ neděle 0 ~ 0%, 1 ~ 5%, 2 ~ 22% … Vytvářet funkci pro každý takový případ, nebo používat poddotaz do číselníku může být časově náročné (množina hodnot je omezená a nemění se v čase)

285 DBI026 -DB Aplikace - MFF UK Podmíněné výrazy SQL-92 definuje dvě podoby CASE výrazu –a) jednoduchý (simple) CASE výraz: CASE výraz WHEN vzor1 THEN obraz1 WHEN vzor2 THEN obraz2 … [ELSE default] END –Vrací obraz pro první shodu výraz=vzor i, resp. default hodnotu, resp. NULL

286 DBI026 -DB Aplikace - MFF UK Podmíněné výrazy SQL-92 definuje dvě podoby CASE výrazu –b) vyhledávací (searched) CASE výraz: CASE WHEN podm1 THEN obraz1 WHEN podm2 THEN obraz2 … [ELSE default] END –Vrací obraz pro první podm i = TRUE, resp. default hodnotu, resp. NULL

287 DBI026 -DB Aplikace - MFF UK Podmíněné výrazy Příklad: SELECT Predmet, CASE Den WHEN 1 THEN ’Pondělí’ WHEN 2 THEN ’Úterý’ … WHEN 7 THEN ’Neděle’ ELSE ’Neznámý den v týdnu’ END AS Den_v_tydnu FROM Rozvrh;

288 DBI026 -DB Aplikace - MFF UK Podmíněné výrazy Příklad prodeje rozdělené dle sazby DPH: SELECT CASE WHEN Sazba=0 THEN Cena ELSE NULL END AS Cena0, CASE WHEN Sazba=1 THEN Cena*1.05 ELSE NULL END AS Cena5, CASE WHEN Sazba=2 THEN Cena*1.22 ELSE NULL END AS Cena22 FROM Prodej;

289 DBI026 -DB Aplikace - MFF UK Podmíněné výrazy v Oracle Oracle obsahuje navíc propretární řešení s využitím funkce DECODE –DECODE(výraz vzor1, obraz1, vzor2, obraz2 [, default]) –Obdoba jednoduchého CASE

290 DBI026 -DB Aplikace - MFF UK Podmíněné výrazy Příklad: SELECT Predmet, DECODE(Den 1, ’Pondělí’, 2, ’Úterý’, … 7, ’Neděle’ ’Neznámý den v týdnu’ ) AS Den_v_tydnu FROM Rozvrh;

291 Agregace dat ROLLUP a CUBE operátory

292 DBI026 -DB Aplikace - MFF UK Agregace dat Pro jednoduché agregace dat v SQL slouží klauzule GROUP BY a HAVING spolu s agregačními funkcemi MIN, MAX, AVG, COUNT, COUNT DISTINCT, … –Vytvářejí z řádků databáze skupiny se shodnými hodnotami v dané množině sloupců –Pro tyto skupiny počítají agregované hodnoty –Jedna skupina řádek vytvoří v agregovaném výsledku jednu řádku

293 DBI026 -DB Aplikace - MFF UK Agregace dat Sloupce, podle kterých se data seskupují nejsou v řadě případů nezávislé, ale tvoří hierarchii –Př.: řetězec obchodů, evidující prodeje zboží: sloupce: Kraj, Město, Pobočka, Prodavač tvoří postupné zpřesnění místa prodeje –Pro management je žádoucí znát obraty pro jednotlivé kraje, města, pobočky i jednotlivé prodavače

294 DBI026 -DB Aplikace - MFF UK Agregace dat Jednou z možností je vygenerování výstupu pomocí několika agregovaných dotazů a jejich spojení pomocí UNION ALL SELECT Kraj, Mesto, Pobocka, Prodavac, SUM(Cena) FROM Prodeje GROUP BY Kraj, Mesto, Pobocka, Prodavac UNION ALL SELECT Kraj, Mesto, Pobocka, NULL, SUM(Cena) FROM Prodeje GROUP BY Kraj, Mesto, Pobocka UNION ALL …

295 DBI026 -DB Aplikace - MFF UK GROUP BY ROLLUP SQL-92 Entry definuje rozšíření klauzule GROUP BY ROLLUP (sloupec 1, sloupec 2, …) která vytváří agregace pro vyšší úrovně automaticky v jediném dotazu  Snadná formulace dotazu  Zajištění konzistence výsledku (původní varianta nemusí při ISOLATION LEVEL < SERIALIZABLE počítat agregace v jednotlivých poddotazech nad stejnými daty)

296 DBI026 -DB Aplikace - MFF UK GROUP BY ROLLUP Pro GROUP BY ROLLUP nad k sloupci se pro každou místo jedné skupiny vytvoří k+1 řádek s agregacemi pro prvních k, k-1, k-2,..., 0 sloupců

297 DBI026 -DB Aplikace - MFF UK GROUP BY ROLLUP SELECT Kraj, Mesto, Pobocka, Prodavac, SUM(Cena) FROM Prodeje GROUP BY ROLLUP ( Kraj, Mesto, Pobocka, Prodavac ); KRAJ MESTO POBOCKA PRODAVAC SUM(CENA) Praha Praha Karlín Novák Praha Praha Karlín Dvořák Praha Praha Karlín Praha Praha Smíchov Malá Praha Praha Smíchov Praha Praha …

298 DBI026 -DB Aplikace - MFF UK Agregace dat Pokud sloupce naopak jsou nezávislé, je v některých případech žádoucí spočítat součty pro všechny podmnožiny sloupců –Př.: řetězec obchodů, evidující prodeje zboží: sloupce: Kraj, TypZboží Potřebujeme znát objemy prodejů jednotlivých typů zboží v jednotlivých krajích, stejně jako prodejnost zboží bez ohledu na kraj, prodejnost v krajích bez ohledu na typ zboží, a celkový obrat firmy

299 DBI026 -DB Aplikace - MFF UK Agregace dat Generovat výsledky pomocí více dotazů je neefektivní, pro k sloupců je potřebné spočítat výsledky pro všech 2 k podmnožin

300 DBI026 -DB Aplikace - MFF UK GROUP BY CUBE Generovat výsledky pomocí více dotazů je neefektivní, pro k sloupců je potřebné spočítat výsledky pro všech 2 k podmnožin SQL-92 Entry definuje rozšíření klauzule GROUP BY CUBE (sloupec 1, sloupec 2, …) která vytváří agregace pro podskupiny automaticky v jediném dotazu

301 DBI026 -DB Aplikace - MFF UK GROUP BY CUBE SELECT Kraj, TypZbozi, SUM(Cena) FROM Prodeje GROUP BY CUBE (Kraj, TypZbozi); KRAJ TYPZBOZI SUM(CENA) Praha Elektro Praha Potraviny Kladno Elektro Liberec Potraviny Praha Elektro …

302 DBI026 -DB Aplikace - MFF UK GROUP BY GROUPING SETS Oracle obsahuje rozšíření GROUP BY GROUPING SETS, Které dovoluje určit jen vybrané podmnožiny sloupců, pro které se agregace počítají SELECT Sloupec 1, Sloupec 2, Sloupec 3, … FROM Tabulka GROUP BY GROUPING SETS( (Sloupec 1, Sloupec 2, Sloupec 3 ), (Sloupec 1, Sloupec 2 ), (Sloupec 2, Sloupec 3 ) );

303 DBI026 -DB Aplikace - MFF UK GROUPING, GROUPING_ID Funkce GROUPING(sloupec)  {0,1} vrací informaci, zda se podle daného sloupce v daném řádku provádělo seskupování, či nikoli Funkce GROUPING_ID  N vrací bitovou mapu sloupců podle kterých se v dané řádce výsledku data seskupovala

304 Fulltextové vyhledávání Filtrace, Disambiguace, Lemmatizace, Indexy, Tezaury, Dotazování Přednáška č. 7

305 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Odlišné od principů běžného vyhledávání –Neprohledávají se striktně strukturovaná data, kde má každý sloupec každé tabulky předem daný význam –Prohledávají se volně psané texty, kde může být stejná událost popsaná více autory rozdílně Různá slova stejného významu (Synonyma) Různé slovní obraty a opisy …

306 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Databázové systémy využívají svých prostředků rozšiřitelnosti a dodávají standardně prostředky, které vyhledávání v textových datech umožňují

307 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Standard: SQL/MM 2 SQL Multimedia and Application Packages Part 2: Full-Text Reálně rozdílné přístupy a možnosti –Neexistuje objektivně nejlepší řešení –Výsledky navíc podléhají subjektivním názorům tazatelů

308 DBI026 -DB Aplikace - MFF UK Porozumění textu Posloupnost slov v přirozeném jazyce. Každé slovo zastupuje pro autora nějakou představu, kterou v něm slovo vyvolá - význam. Tyto představy reprezentují reálné předměty....

309 DBI026 -DB Aplikace - MFF UK Porozumění textu Synonymie slov –Více slov může mít pro autora stejný význam krychle = kostka buldozer = nakladač...

310 DBI026 -DB Aplikace - MFF UK Porozumění textu Homonymie slov –Jedno slovo může mít pro autora několik významů taška: střešní, nákupní koruna: platidlo, královská k., k. stromu třída: školní, kategorie v teorii množin los: zvíře, poukázka ke slosování...

311 DBI026 -DB Aplikace - MFF UK Porozumění textu Homonymie slov –Jedno slovo může používat stejný tvar pro různé pády a další gramatické jevy (gramatická homonymie) kontroly: 1. p. m.č., 2. p. j.č. není zřejmé, zda se jedná o jednu, nebo více kontrol –Jeden tvar slova může mít různý význam plesy: podst. jm. ples, podst. jm. pleso žena: podst. jm. žena, sloveso hnát hnát: sloveso hnát, podst. jm. hnát tři: číslovka tři, sloveso třít pět: číslovka pět, sloveso pět

312 DBI026 -DB Aplikace - MFF UK Porozumění textu Významy slov se mohou překrývat. –Hierarchicky zvíře > kůň > hřebec –Asociace kalkulátor ~ počítač ~ procesor...

313 DBI026 -DB Aplikace - MFF UK Porozumění textu Jednotlivá přiřazení jsou navíc závislá na subjektu, který dokument píše nebo čte. –Dva lidé mohou jednomu slovu přikládat zcela nebo jen částečně jiný význam. –Dva lidé si i pod stejným významem mohou představit jiný konkrétní předmět nebo množinu předmětů. máma, pokoj,... Výsledkem je situace, kdy dva různí čtenáři nemusí přečtením získat stejnou informaci jako autor, ani navzájem.

314 DBI026 -DB Aplikace - MFF UK Porozumění textu Homonymie a nejednoznačnosti narůstají při přechodu od slov k větám. –Homonymie vlastních jmen na začátku věty Dohnal zvítězil. (srov. Čtrnáctý zvítězil.) Plk. Dohnal předešel gen. Kvapila velmi výrazně. - jedna, dvě, nebo tři věty? –Homonymie spojky a v předmětu věty Funkce rezistoru a zesilovače v radiotechnice. (funkce rezistoru v radiotechnice) a (funkce zesilovače v radiotechnice) (funkce rezistoru) a (funkce zesilovače v radiotechnice) (funkce rezistoru) a (zesilovače v radiotechnice) –Homonymie podmětu a předmětu Popílek přikryl sníh. – co leží navrchu?

315 DBI026 -DB Aplikace - MFF UK Porozumění textu Příklad české věty s více gramaticky možnými významy –viz např. Podivné fungování gramatiky, fungování gramatiky –věta „Ženu holí stroj“ může - podle volby přísudku ve větě - znamenat: Poháním stroj pomocí hole (hnát) Žena používá depilační přístroj (holit) Návod k nekonvenčnímu způsobu oblékání (strojit) … a další –Oblékej ženu, patřící holím, –Ženu stroj, patřící holím

316 DBI026 -DB Aplikace - MFF UK Porozumění textu Příklad anglické věty s více gramaticky možnými významy –viz např. Podivné fungování gramatiky, fungování gramatiky –věta „Time flies like an arrow“ může - podle volby přísudku ve větě - znamenat: Čas letí jako voda (fly) Časové mouchy/zipy mají rády šíp (like) … a další

317 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Samotná formulace dotazu, který by vrátil všechny dokumenty, které tazatele zajímají a žádné jiné obvykle nelze zformulovat –Spolu s vyhovujícími – relevantními – odpověďmi se obvykle vrací i odpovědi nerelevantní

318 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Problémy –Homonyma Ptá se tazatel dotazem „koruna“ na finanční, lesnické či panovnické dokumenty? –Synonyma Vyhovuje dokument o „krychlích“ dotazu na dokumenty o „kostkách“? Vyhovuje dokument o „stromech“ dotazu na „souvislé grafy bez cyklů“?

319 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Problémy –Hierarchie významů Zvíře – Savec – Šelma – Medvěd Tiskovina – Časopis –Ohebnost slov Jít, Jde, Jdu, Jdou, …

320 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Striktní boolská logika není pro formulaci dotazů příliš vhodná –Dokument buďto vyhovuje dotazu, nebo nevyhovuje –Dotazování v textech vyžaduje třídit odpovědi podle předpokládané vhodnosti pro tazatele Je potřebné mít možnost definovat míru shody dotazu s dokumentem

321 DBI026 -DB Aplikace - MFF UK Přesnost a úplnost Dva DIS mohou vrátit na shodný dotaz různé odpovědi, které se nemusí překrývat ani v jediném vráceném dokumentu  Jak porovnat kvalitu odpovědí navzájem? Dokumenty v databázi Relevantní dokumenty Vrácené v DIS 1 Vrácené v DIS 2

322 DBI026 -DB Aplikace - MFF UK Přesnost a úplnost Dva tazatelé mohou mít při položení shodného dotazu různý názor na relevanci vrácených dokumentů  Jak vyhovět subjektivnímu názoru tazatelů? Dokumenty v databázi Relevantní Vrácené dok. Relevantní  

323 DBI026 -DB Aplikace - MFF UK Přesnost a úplnost Kvalita výsledné množiny dokumentů se měří na základě těchto čísel –Přesnost (Precision) P = Nvr / Nv Pravděpodobnost, že dokument zařazený v odpovědi je skutečně relevantní –Úplnost (Recall) R = Nvr / Nr Pravděpodobnost, že skutečně relevantní dokument je zařazený v odpovědi

324 DBI026 -DB Aplikace - MFF UK Přesnost a úplnost Koeficienty jsou opět závislé na subjektivním názoru tazatele Dokument vrácený na výstupu může uspokojovat požadavky dvou uživatel, kteří položili stejný dotaz, různou měrou.

325 DBI026 -DB Aplikace - MFF UK Přesnost a úplnost V ideálním případě –P=R=1 –V odpovědi jsou zařazeny právě a pouze všechny relevantní dokumenty V běžném případě –Odpověď na první verzi dotazu není ani přesná, ani úplná Optimum Počáteční odpověď

326 DBI026 -DB Aplikace - MFF UK Přesnost a úplnost Ladění dotazu –Postupná modifikace dotazu s cílem zvýšit kvalitu odpovědi Teoreticky je sice možné dosáhnout optima, ale … Optimum R P

327 DBI026 -DB Aplikace - MFF UK Přesnost a úplnost … vlivem víceznačností jsou v praxi oba koeficienty na sobě nepřímo závislé, tj. P*R  konst. < 1 –Při snaze zvýšit P se na výstup dostane méně relev. dokumentů. –Při snaze zvýšit R se na výstup dostane s více relev. dok. i mnohem více těch nerelevantních Optimum R P

328 DBI026 -DB Aplikace - MFF UK Kritérium predikce Při formulaci dotazů je potřebné uhádnout, které termy (slova) byly v dokumentu autorem použity pro vyjádření dané myšlenky –Problémy m.j. způsobují Synonyma (autor mohl použít synonymum, které si tazatel při formulaci dotazů ani nemusí neuvědomí) Překrývající se významy slov Opisy jedné situace jinými slovy

329 DBI026 -DB Aplikace - MFF UK Kritérium predikce Částečným řešením je zařazení tezauru, který obsahuje –Hierarchie slov a jejich významů –Synonyma slov –Asociace mezi slovy Tazatel může tezaurus využít při formulaci svých dotazů

330 DBI026 -DB Aplikace - MFF UK Kritérium predikce Při ladění dotazů má uživatel tendenci postupovat konzervativně –V dotazu zůstávají často ty jeho části, které uživatele napadly na začátku a mění se jen podružné části, které nekvalitní výsledek nemusí nijak zásadně ovlivnit Vhodné je uživateli pomoci s odstraněním nevhodných částí dotazu, které nepopisují relevantní dokumenty a naopak s přidáváním formulací, které relevantní dokumenty popisují

331 DBI026 -DB Aplikace - MFF UK Kritérium maxima Tazatel obvykle není schopen (nebo ochoten) procházet příliš mnoho dokumentů do té míry, aby se rozhodl, zda jsou pro něj relevantní nebo ne Obvykle podle velikosti  Potřeba nejen dokumenty rozlišovat na odpovídající/neodpovídající dotazu, ale řadit je na výstupu podle míry předpokládané relevance

332 DBI026 -DB Aplikace - MFF UK Kritérium maxima V důsledku kritéria maxima se při ladění dotazu uživatel obvykle snaží zvýšit přesnost –Malé množství dokumentů v odpovědi, obsahující co největší poměr relevantních dokumentů Některé oblasti použití vyžadují co nejvyšší přesnost i úplnost –Právnictví „lepší“ Vr. Rel. „horší“ Vr. Rel.

333 DBI026 -DB Aplikace - MFF UK Obvyklý postup předzpracování Databáze obvykle používají některý z boolských modelů reprezentace dokumentů –Nejlépe odpovídá běžným dotazům –Relativně snadno se implementuje –Dotazy jsou ve formě boolských formulí, ve kterých operandy tvoří jednotlivá slova Řada různých modifikací

334 DBI026 -DB Aplikace - MFF UK Obvyklý postup předzpracování Filtrace Lemmatizace Desambiguace Stoplist Lemm. text Indexace Seznam lemmat Invertovaný seznam Tezaurus

335 DBI026 -DB Aplikace - MFF UK Obvyklý postup předzpracování Filtrace –Odstraní formátovací značky a nechá čistý ASCII text Desambiguace –Určí význam slova podle kontextu „pět chválu“ … sloveso pět „pět vozidel“ … číslovka pět Lemmatizace –Určí základní tvar slova a gramatický tvar v dokumentu –Často nahrazen pomocí stemmeru, který hledá kmen slova

336 DBI026 -DB Aplikace - MFF UK Obvyklý postup předzpracování Indexace –Vytvoří pomocné seznamy lemmat a dokumentů a invertovaný soubor dvojice [id_dok,id_lemmatu] setříděné dle id_lemmatu a zbavené duplicit dnes obvykle více informací, např. pětice [id_dok,č_odstavce,č_věty,č_slova,id_lemmatu] setříděné id_lemmatu –Dovoluje vyhodnocování tzv. proximitních omezení na vzdálenost slov v dokumentu

337 DBI026 -DB Aplikace - MFF UK Fulltextové vyhledávání Pro podporu vyhledávání je potřeba nad textovým sloupcem vytvořit index – invertovaný soubor Běžné textové sloupce jsou pro tyto účely krátké a nevyhovující –Obvykle se takto indexují sloupce některého z LOB (Large OBject) typů

338 DBI026 -DB Aplikace - MFF UK Large OBjects (LOB) LOBy –Standardní typy pro ukládání objemných dat na serveru definován v SQL-92 Full Až 4GB dat –BLOB… standardní binární typ –CLOB… znakový typ v univerzální znakové sadě serveru –NCLOB… znakový typ v národní znakové sadě serveru –V Oracle navíc externí typ BFILE pouze pro čtení samostatný binární soubor uložený vně databáze v OS

339 DBI026 -DB Aplikace - MFF UK Large OBjects (LOB) LOBy –Standardní typy pro ukládání objemných dat na serveru definován v SQL-92 Full Až 4GB dat –BLOB… standardní binární typ –CLOB… znakový typ v univerzální znakové sadě serveru –NCLOB… znakový typ v národní znakové sadě serveru –V MS SQL –Image… binární data do velikosti 2 GB –Text… textová data do velikosti 2 GB –NText… textová data v národní znakové sadě do vel. 1 GB

340 DBI026 -DB Aplikace - MFF UK Large Objects Ve sloupcích tabulky je uložen pouze deskriptor (tzv. LOB lokátor), odkazující na samotně uložená data

341 DBI026 -DB Aplikace - MFF UK Struktura MS SQL full-text

342 DBI026 -DB Aplikace - MFF UK MS SQL fulltext Vytvoření indexu nad textovým sloupcem CREATE FULLTEXT INDEX ON table_name [(column_name [TYPE COLUMN type_column_name] [LANGUAGE language_term] [,...n])] KEY INDEX index_name [ON fulltext_catalog_name] [WITH {CHANGE_TRACKING {MANUAL | AUTO | OFF [, NO POPULATION]}} ]

343 DBI026 -DB Aplikace - MFF UK MS SQL fulltext Potřebné zadat –Jméno tabulky, jméno textového sloupce typu char, nchar, varchar, nvarchar, text, ntext –Jméno (co nejmenšího) unikátního indexu nad tabulkou v klauzuli KEY INDEX

344 DBI026 -DB Aplikace - MFF UK MS SQL fulltext Z dalších možností: –Definice jazyka (LANGUAGE) –Způsob aktualizace WITH CHANGE_TRACKING MANUAL … vytváření žurnálu změn v datech, jeho promítnutí do indexu se může provést ručně, nebo automaticky schedulerem AUTO … index se bude aktualizovat zároveň s daty OFF … index se nebude aktualizovat vůbec

345 DBI026 -DB Aplikace - MFF UK MS SQL fulltext Příklad vytvoření indexu: USE AdventureWorks; GO CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID); CREATE FULLTEXT CATALOG ft AS DEFAULT; CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume) KEY INDEX ui_ukJobCand; GO

346 DBI026 -DB Aplikace - MFF UK Struktura Oracle full-text

347 DBI026 -DB Aplikace - MFF UK Oracle fulltext Filtrování vstupních dokumentů –NULL_FILTER pro textové dokumenty TXT, HTML, XML –INSO_FILTER pro binární dokumenty –CHARSET_FILTER pro konverzi získaných dokumentů do znakové sady databáze

348 DBI026 -DB Aplikace - MFF UK Oracle fulltext Druhy fulltextových indexů –CONTEXT Základní typ indexu pro vyhledávání v textových datech Vhodný pro větší dokumenty Synchronizace indexu s daty je nutné provést explicitně zavoláním CTX_DDL.SYNC_INDEX (obdoba WITH CHANGE_TRACKING MANUAL z MS SQL)

349 DBI026 -DB Aplikace - MFF UK Oracle fulltext Druhy fulltextových indexů –CTXCAT Vhodný pro menší dokumenty a jejich úryvky Může být zkombinován s dalšími netextovými sloupci pro kombinované dotazování Synchronizace indexu s daty se provádí automaticky se změnami v tabulce (obdoba WITH CHANGE_TRACKING AUTO z MS SQL)

350 DBI026 -DB Aplikace - MFF UK Oracle fulltext Druhy fulltextových indexů –CTXRULE Postaven na množině předdefinovaných dotazů Slouží pro klasifikaci dokumentů do skupin podle toho, kterým dotazům vyhovuje

351 DBI026 -DB Aplikace - MFF UK Oracle fulltext Uložení dokumentů –NORMAL_DATASTORE Text je v jednom sloupci jednoho řádku –MULTI_COLUMN_DATASTORE Text je ve více sloupcích jednoho řádku –URL_DATASTORE Text je na Internetu, dostupný přes URL ve sloupci –…

352 DBI026 -DB Aplikace - MFF UK Oracle fulltext Vytvoření indexu nad textovým sloupcem CREATE INDEX index_name ON table_name(column_name) INDEXTYPE IS ctxsys.{context|ctxcat|ctxrule} [PARAMETERS (’param_name param_value …’)];

353 DBI026 -DB Aplikace - MFF UK Oracle fulltext Potřebné zadat –Jméno tabulky, jméno textového sloupce typu char, nchar, varchar2, nvarchar2, clob, nclob –Typ indexu

354 DBI026 -DB Aplikace - MFF UK Oracle fulltext Z dalších možností: –Filter … formát vstupních dat –Lexer … členění textu na slova s ohledem na jazyk, diakritiku a její přepisy (ö, oe, o), … –Datastore –Stoplist, –…

355 DBI026 -DB Aplikace - MFF UK Oracle fulltext Příklad vytvoření indexu: CREATE INDEX myindex ON doc(htmlfile) INDEXTYPE IS ctxsys.context PARAMETERS( ’datastore ctxsys.default_datastore filter ctxsys.null_filter section group ctxsys.html_section_group’);

356 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Spolu s novými typy indexů databáze implementují nové operátory pro porovnávání dotazu s textem Operátory vrací číslo – očekávanou míru shody obsahu textu s tazatelovými požadavky

357 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem MS SQL používá boolský operátor – predikát CONTAINS( sloupec, ’dotaz’[, LANGUAGE jazyk ])

358 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Oracle používá numerickou funkci CONTAINS( sloupec, ’dotaz’[, číslo_porovnání ]) Pomocí SCORE(číslo_porovnání) lze v SELECT části zjistit hodnotu operátoru

359 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Operátory pro dotazování –AND, & … ‘mice & cats’ –OR, | … ‘mice | cats’ –AND NOT, & ! … ‘mice AND NOT cats’ –NEAR, ~ … proximitní dotazování ‘mice NEAR cats’

360 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Operátory pro dotazování –Fráze v uvozovkách –FORMSOF ( INFLECTIONAL, slovo) slovo se hledá ve všech tvarech hide, hidden, … –FORMSOF ( THESAURUS, slovo) slovo se rozvine pomocí tezauru pro daný jazyk na seznam slov s podobným významem

361 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Operátory pro dotazování –Začátek slova následovaný hvězdičkou pro hledání všech slov začínajících prefixem –ISABOUT ( slovo WEIGHT (n) [,…]) Vážený term, vhodný pro dotazy s využitím operátoru CONTAINSTABLE

362 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem CONTAINSTABLE( tabulka,sloupec,dotaz[,jazyk][,top_n] ) –Vrací tabulku hodnot shody sloupce tabulky s dotazem. Ohodnocení je v pseudo sloupci RANK

363 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem SELECT select_list FROM table AS FT_TBL INNER JOIN CONTAINSTABLE(table, column, query) AS KEY_TBL ON FT_TBL.unique_key_column = KEY_TBL.[KEY]

364 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN CONTAINSTABLE(Categories, Description, 'ISABOUT (breads weight (.8), fish weight (.4), beers weight (.2) )' ) AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC

365 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK FROM Categories AS FT_TBL INNER JOIN CONTAINSTABLE (Categories, Description, '("sweet and savory" NEAR sauces) OR ("sweet and savory" NEAR candies)', 10) AS KEY_TBL ON FT_TBL.CategoryID = KEY_TBL.[KEY]

366 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Operátory pro dotazování –AND, & … ‘mice & cats’ –OR, | … ‘mice | cats’ –NOT, ~ … ‘mice ~ cats’ –NEAR, ; … proximitní dotazování ‘mice ; cats’ NEAR((mice,cats),5)

367 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Operátory pro dotazování –ABOUT ( téma ) dokumenty pojednávající o tématu ‘about(politics)’ –WEIGHT, * vynásobí skóre výrazu danou konstantou –STEM, $ nalezne termy se stejným slovním základem

368 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Operátory pro dotazování –Na začátku / konci slova je možné uvést zástupné symboly _ a % –dotaz WITHIN PARAGRAPH dotaz WITHIN SENTENCE Hledání v rámci odstavce, věty

369 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem SELECT nazev, SCORE(1)+SCORE(2) FROM dokument WHERE CONTAINS( abstrakt,’database & search’,1 ) > 0 AND CONTAINS( text, ’(object|relational) NEAR database’, 2 ) > 0

370 DBI026 -DB Aplikace - MFF UK Dotazování se nad textovým indexem Využití tezauru –BT(slovo[,n]) … zahrnout i širší term pro slovo pokud je slovo homonymní, zahrnout všechny –NT(slovo[,n]) … zahrnout i užší termy pro slovo –PT(slovo) … nahradit preferovaným termem pro slovo –TT(slovo) … nahradit nejširším termem pro slovo –SYN(slovo) … zahrnout i synonyma pro slovo

371 DBI026 -DB Aplikace - MFF UK Synonyma v Oracle Vytvoření CREATE [PUBLIC] SYNONYM jmeno FOR [schema.]stare_jmeno; Zrušení DROP [PUBLIC] SYNONYM jmeno; Všude, kde lze použít původní název, lze použít nové jméno Lze vytvářet synonyma téměř ke všemu včetně synonym Veřejná synonyma vidí všichni bez prefixu vlastníka

372 Využití XML v DB aplikacích

373 DBI026 -DB Aplikace - MFF UK Komunikace aplikace s okolím Databázová aplikace potřebuje často komunikovat s dalšími informačními systémy –Export podkladů z IS pro externí účetnictví –B2G (business-to-government) Export výkazů pro státní správu –B2B (business-to-business) Import údajů z IS jiných firem Elektronické objednávky –SOA service-oriented architecture Komunikace mezi jednotlivými komponentami

374 DBI026 -DB Aplikace - MFF UK Komunikace aplikace s okolím Pro komunikaci se ve stále větší míře používá XML formát dat  Čitelný i pro lidskou obsluhu aplikací  Strukturovaný  Snadno parsovatelný –Velký objem dat –Přímé dotazování nad XML daty vyžaduje zcela odlišné nástroje a datové struktury, než relační databází

375 DBI026 -DB Aplikace - MFF UK XML a relační databáze Pro komunikaci databázové aplikace s okolím je proto často potřebné –Exportovat uložená relační data do XML –Získat informace uložené v uzlech XML stromu a uložit je do relačních tabulek –Ukládat původní XML dokumenty, získané od obchodních partnerů –Vyhledávat XML dokumenty obsahující dané informace

376 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath XPath je jedním z často používaných dotazovacích jazyků nad XML Výsledkem dotazu je množina uzlů či atributů, které vyhovují zadané podmínce Dokument je chápán jako strom, obsahující –Kořenový uzel (není součástí dokumentu) –Elementy –Atributy –Textové uzly (listy, odpovídají volnému textu mezi uzly) –… (komentáře, jmenné prostory, instrukce pro zpracování)

377 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath Cesta je základním prostředkem pro adresaci uzlu či uzlů ve stromě –Absolutní začínají znakem ’/’ –Relativní –Zapisuje se jako seznam kroků, oddělených lomítky.

378 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath Příklady Xpath dotazů –/knihy/kniha/nazev seznam všech elementů nazev, které jsou přímým potomkem elementu kniha, který je přímým potomkem kořenového elementu knihy. –//nazev seznam všech elementů nazev v XML stromu, nacházejících se na libovolných cestách

379 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath Příklady Xpath dotazů –/knihy/*/nazev na druhém kroku cesty může být libovolný element –/knihy/kniha[1]/autor[2] druhý autor první knihy v seznamu –/knihy/kniha[autor=’Pokorný J.’]/titul tituly všech knih od J. Pokorného

380 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath Osy v XPath –self:: - aktuální uzel –parent::, child:: - přímý rodič/potomci aktuálního uzlu –ancestor::, descendand:: - všichni předci/potomci, včetně nepřímých –descendand-or-self::, ancestor -or-self:: –following::, preceding:: - uzly před/za aktuálním uzlem a všemi jeho předky –following-sibling::, preceding-sibling:: - sourozenci –attribute:: - atributy aktuálního uzlu child:: tvoří defaultní osu, nemusí se uvádět

381 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath preceding::following::

382 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath Obvykle se využívají zkrácené notace –jméno_uzlu místo child::jméno_uzlu místo attribute:: jméno_atributu –’.’ pro aktuální uzel –’..’ pro rodičovský uzel

383 DBI026 -DB Aplikace - MFF UK Adresování dat v XML - XPath Příklady dotazů –Názvy všech knih /knihy/kniha/nazev/text() –První kniha v seznamu /knihy/kniha[1] … …

384 DBI026 -DB Aplikace - MFF UK Indexování dat v XML Problémem je efektivita vyhodnocování XPath dotazů, případně dotazů v jiných dotazovacích jazycích nad XML –Data mohou být v relační databázi uložena po částech, a využity standardní nástroje (spojení, indexy)  Použitelné v libovolné relační databázi  Nutná znalost struktury ukládaných dokumentů (DTD, XMLSchema) –Data mohou být uložena nativně v podobě textu  Nutná podpora speciálních typů indexů

385 DBI026 -DB Aplikace - MFF UK Ukládání XML do relačních databází Pokud je potřeba ukládat XML dokumenty, platné vzhledem ke konkrétnímu DTD, je možné použít několik variant uložení Nástin jednoho z možných řešení: –Předpokládá dostatečně jednoduché DTD, nebo vytvoření jednoduššího DTD’, které je méně striktní, než DTD původní, tj.: platnost v DTD  platnost v DTD’ Elementy jmenují jiné elementy ve svém obsahu nejvýše jednou Obsažený element může být nepovinný (?) nebo opakující se (*) Obsažené elementy jsou oddělené pouze čárkou, ne ’|’ Na pořadí elementů nezáleží

386 DBI026 -DB Aplikace - MFF UK Ukládání XML do relačních databází Pro takto zjednodušené DTD je možné vytvořit –Seznam možných cest v XML stromu –Pro každý element je E vytvořena tabulka, obsahující sloupce pro jednotlivé atributy E(DocID,ElemID,ParID,PathID,atributy) Id dokumentu, Id elementu,sloupce pro uchování atributů, Id rodičovského elementu, Id cesty na které element leží

387 DBI026 -DB Aplikace - MFF UK Ukládání XML do relačních databází Kniha(DocID,ElemID,ParID,PathID,ISBN) Titul(DocID,ElemID,ParID,PathID,PCDataId) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data)

388 DBI026 -DB Aplikace - MFF UK Ukládání XML do relačních databází Dotazy v XPath jsou přeformulovány na SQL Často je nutné spojovat velké množství tabulek. Jejich počet je možné snížit např. tím, že pro podstromy, ve kterých se nemůže vyskytovat opakující se element, se vytvoří jediná tabulka obsahující element a všechny podelementy XML Schema ER/RMD XML Dok. XPath dotaz SQL dotaz Data v RDB XML Dok. Transformace v: –Klientské části –V některých implementacích relačních databází

389 DBI026 -DB Aplikace - MFF UK Ukládání XML do relačních databází Kniha( DocID,ElemID, ISBN, TitulPCDataId, AutorPCDataId, ParID,PathID) PCData(DocID,ElemID,Data)

390 DBI026 -DB Aplikace - MFF UK Ukládání XML do relačních databází Pokud se autor může vícekrát opakovat, je nutné jej uložit do samostatné tabulky, titul ale může být sloučen Kniha( DocID,ElemID,ISBN,TitulPCDataId,ParID,PathID) Autor(DocID,ElemID,ParID,PathID,PCDataId) PCData(DocID,ElemID,Data)

391 DBI026 -DB Aplikace - MFF UK Indexace XML dat DataGuide index –obsahuje strom cest, vyskytujících se v XML dokumentu –Každá cesta je vněm uložena právě jednou –Uzly obsahují metainformace o uzlech, které dané cestě odpovídají –Je možné jej uložit v XML formátu

392 DBI026 -DB Aplikace - MFF UK Indexace XML dat Index cest v XML –Obdoba DataGuide indexu –V uzlech obsahuje přímo množiny odkazů na jednotlivé elementy, které cestě odpovídají –Výrazně urychluje odpovědi na dotazy ve formě cest bez použití // –Přispívá pro vyhodnocení dotazů, které alespoň začínají absolutní cestou, a // obsahují ve větší hloubce

393 DBI026 -DB Aplikace - MFF UK Indexace XML dat Lore Index –VIndex (Value index) - indexuje textové hodnoty uzlů a atributů –TIndex (Term index) - indexuje slova v hodnotách elementů –LIndex - index pro nalezení otců pro jednotlivé uzly –PIndex (Path index) - indexuje cesty a udržuje pro ně množiny odpovídajících uzlů

394 DBI026 -DB Aplikace - MFF UK Indexace XML dat Lore Index pomocí VIndexu se naleznou atributy stat s hodnotou ”CZ”, pro ně se bottom-up postupem přes LIndex ověří cesta

395 DBI026 -DB Aplikace - MFF UK Uložení XML dat – MS SQL Nativní datový typ XML –CREATE TABLE XmlTab( ID NUMERIC CONSTRAINT XmlTabPk PRIMARY KEY, Dok XML ); –INSERT INTO XmlTab VALUES( 1, ’ b1 ’ );

396 DBI026 -DB Aplikace - MFF UK Uložení XML dat– Oracle Typ XMLType, který dovoluje dvojí způsob uložení: –Pomocí CLOB Dokument je vrácen přesně v původním tvaru včetně bílých znaků (formátování)  Není nutné znát XMLSchema  Komplikované částečné aktualizace  Ve starších verzích pouze full-text indexování

397 DBI026 -DB Aplikace - MFF UK Uložení XML dat– Oracle Typ XMLType, který dovoluje dvojí způsob uložení: –Pomocí rozložení do tabulek Je vrácen dokument, shodný s ohledem na DOM, tj. bez zachování bílých znaků (formátování)  Je nutné znát a předem v databázi zaregistrovat XMLSchema  Efektivní částečné aktualizace  Možné indexování i pomocí B-stromů

398 DBI026 -DB Aplikace - MFF UK Uložení XML dat – Oracle Nativní datový typ XMLType –CREATE TABLE XmlTab( ID NUMERIC CONSTRAINT XmlTabPk PRIMARY KEY, Dok XMLType ); –INSERT INTO XmlTab VALUES( 1, ’ b1 ’ );

399 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – MS SQL MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT … FOR XML {RAW|AUTO|EXPLICIT|PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] [ROOT(’korenovy_element’)]

400 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – MS SQL MS SQL pro export dat z tabulek do XML podoby používá konstrukci SELECT … FOR XML {RAW|AUTO|EXPLICIT|PATH} [,XMLDATA][,ELEMENTS][BINARY BASE64] RAW generuje pro každou řádku jeden element row, hodnoty jsou obsažené v atributech elementu, názvy atributů odpovídají názvům sloupců (aliasů) v dotaz

401 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – MS SQL AUTO generuje pro každou tabulku v použitém dotazu a řádek jeden element. Struktura odpovídá spojení. Názvy elementů odpovídají názvům tabulek

402 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – MS SQL Modifikátor ELEMENTS zajistí, že hodnoty atributů jsou uloženy jako podelementy, nikoli jako atributy King 4560 Scott...

403 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – Oracle Pro export dat do XML lze použít např. funkci SYS_XMLGEN, která jako argument může dostat buďto atomickou hodnotu, nebo strukturovaný uživatelský datový typ SELECT SYS_XMLGEN(ename) FROM … SMITH ALLEN...

404 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – Oracle SYS_XMLGEN(instance) –SELECT SYS_XMLGEN( dept_t(deptno,dname, CAST(MULTISET( select empno, ename from emp e where e.deptno = d.deptno) AS emplist_t))).getClobVal() AS deptxml FROM dept d; Sports John Jack

405 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – Oracle XML lze generovat rovněž po částech s použitím řady funkcí. XMLElement( jméno[,atributy][,potomek 1, …]] ) XMLAttributes(jm 1 AS alias 1 [, …])

406 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – Oracle SELECT XMLElement( ”emp”, XMLAttributes(empno, ename AS name), XMLElement(”salary”, sal), XMLElement(”comm”, comm) ) FROM Emp WHERE empno=1000; Každý řádek vygeneruje jednu hodnotu XMLType

407 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – Oracle XMLForest(hodnota1 AS alias1, …) Vygeneruje posloupnost elementů která nemá jediný kořen, nejedná se proto o XML dokument SELECT XMLForest( empno, deptno as name ) FROM emp; …

408 DBI026 -DB Aplikace - MFF UK Export tabulky do XML – Oracle XMLConcat(XML 1, …) Sloučí všechny XML dokumenty za sebe, výsledkem nebude XML dokument, protože bude obsahovat více kořenových elementů XMLSequence(fragment) Kolekce XML dokumentů, každý odpovídá jednomu kořenovému elementu ve fragmentu

409 DBI026 -DB Aplikace - MFF UK Indexování XML dat – MS SQL MS SQL dovoluje nad sloupcem typu XML vytvořit tři typy indexů –Nejprve je nutné vytvořit primární XML index CREATE PRIMARY XML INDEX XmlIdx ON XmlTab(Dok) –Následně lze vytvořit hodnotový index, index cest a index vlastností CREATE XML INDEX jm ON XmlTab(Dok) USING XML INDEX XmlIdx FOR {VALUE|PATH|PROPERTY}

410 DBI026 -DB Aplikace - MFF UK Indexování XML dat – Oracle Oracle dovoluje nad sloupcem typu XML vytvořit indexy: –Fulltextový (CTXSYS.Context) CREATE INDEX XmlFtIdx ON XmlTab(Dok) INDEXTYPE IS CTXSYS.Context –XMLIndex ( CTXSYS.CTXXPath – Oracle 10g) CREATE INDEX XmlPathIdx ON XmlTab(Dok) INDEXTYPE IS CTXSYS.CTXXPath –XMLIndex ( XDB.XmlIndex – Oracle 11g) CREATE INDEX XmlIdx ON XmlTab(Dok) INDEXTYPE IS XDB. XMLType Indexuje cesty, pozice elementů, hodnoty

411 DBI026 -DB Aplikace - MFF UK Získání dat z XML Pokud je k dispozici XML dokument s požadavkem na databázovou aplikaci, je potřebné získat z něj potřebné údaje a požadavek vyřídit, nebo data uložit do relační databáze

412 DBI026 -DB Aplikace - MFF UK Získání dat z XML – MS SQL Využívá XPath pro adresaci jednotlivých elementů a jejich množin, případně Xquery pro konstrukci výsledného XML z XML zdrojového xml.Query(dotaz) –Vrací fragment, obsahující elementy, vyhovující dotazu –Dok.Query(’/kniha/autor’) xml.Exist(dotaz) –Vrací 1, pokud ex. alespoň jeden uzel, odpovídající dotazu. Jinak vrací 0 xml.Value(dotaz,typ) –Vrací hodnotu odpovídajícího uzlu

413 DBI026 -DB Aplikace - MFF UK Získání dat z XML – Oracle Využívá XPath pro adresaci jednotlivých elementů a jejich množin Extract(xml,xpath) –Vrací fragment, obsahující elementy, vyhovující dotazu –Extract(xml,’/kniha/autor’) ExistsNode(xml,xpath) –Vrací 1, pokud ex. alespoň jeden uzel, odpovídající dotazu. Jinak vrací 0 ExtractValue(xml,xpath) –Vrací hodnotu (jediného) odpovídajícího uzlu

414 DBI026 -DB Aplikace - MFF UK Získání dat z XML – MS SQL SELECT dok.Query(’/kniha/autor’) FROM knihy; – Pokorný J. – Král J. SELECT dok.Value(’/kniha/autor’,’varchar(30)’) FROM knihy; –Pokorný J. –Král J.

415 DBI026 -DB Aplikace - MFF UK Získání dat z XML – Oracle SELECT Extract(dok,’/kniha/autor’) FROM knihy; – Pokorný J. – Král J. SELECT ExtractValue(dok,’/kniha/autor’) FROM knihy; –Pokorný J. –Král J.

416 DBI026 -DB Aplikace - MFF UK Aktualizace XML - MS SQL Metoda xml.Modify(’XQuery’) UPDATE Knihy SET seznam=seznam.Modify( ’delete /knihy/kniha[autor=”Kopecký M.”]’ ) WHERE … UPDATE Knihy SET seznam=seznam.Modify( ’insert … … into /knihy’) WHERE...

417 DBI026 -DB Aplikace - MFF UK Aktualizace XML - Oracle Funkce UpdateXML(xml,path 1,val 1,path 2,val 2,…) UPDATE Knihy SET seznam=UpdateXML(seznam, ’/kniha[nazev=”DIS”]/autor’,’Pokorný J.’ ) WHERE …

418 DBI026 -DB Aplikace - MFF UK Zpřístupnění XML dat – MS SQL Pomocí nástroje „IIS Virtual Directory Management for SQL Server “ lze definovat v IIS 5 a vyšším adresář, pomocí kterého lze XML data publikovat na webu //http://localhost/xml?SELECT * FROM KNIHY FOR XML AUTO&root=knihy

419 DBI026 -DB Aplikace - MFF UK Zpřístupnění XML dat – Oracle Pomocí XML DB repozitory je možné XML dokumenty, uložené v databázi, zveřejnit na webu ve virtuálních adresářích

420 DBI026 -DB Aplikace - MFF UK Přístup ke vzdáleným XML zdrojům HttpUriType –Konstruktor HttpUriType(url) –Metody GetCLOB() GetBLOB() GetXML()

421 Objektové rozšíření Strukturované typy Pole Hnízděné tabulky

422 DBI026 -DB Aplikace - MFF UK Objektové rozšíření – SQL:1999 Nové rysy v normě ANSI SQL:1999 –Rozšiřitelnost Standardizace typů pro objemná data –typ BLOB (Binary Large OBjects) –typ CLOB (Character Large OBjects) –Možnosti interpretace jejich vnitřního obsahu texty, obrázky, zvuky, videa,... Možnosti doplňování dalších formátů a manipulace s nimi

423 DBI026 -DB Aplikace - MFF UK Objektové rozšíření – SQL:1999 Nové rysy v normě ANSI SQL:1999 –Rozšiřitelnost Nové (uživatelské) datové typy - UDT –Abstraktní datové typy – ADT »Strukturovaná data –Řádkové typy –Reference –…

424 DBI026 -DB Aplikace - MFF UK Abstraktní datové typy – SQL:1999 Možnost vytvářet vlastní strukturované datové typy zapouzdřující data a operace (například porovnávací operace) –Metody psané buďto v SQL, nebo externích jazycích (C, Pascal, …)

425 DBI026 -DB Aplikace - MFF UK Abstraktní datové typy – SQL:1999 ADT mohou tvořit hierarchie s jednoduchou dědičností Je podporován polymorfismus metod a dotazů nad daty

426 DBI026 -DB Aplikace - MFF UK Abstraktní datové typy – SQL:1999 Příklad ADT CREATE TYPE T_Student AS ( JmCHAR(30), AdresaCHAR(40), Zac_ studia DATE ) UNINSTANTIABLE NOT FINAL METHOD Poc_Prednasek() RETURNS INTEGER;

427 DBI026 -DB Aplikace - MFF UK Abstraktní datové typy – SQL:1999 Pomocí [UN]INSTANTIABLE je možné zakázat či povolit vytváření instancí daného typu –V daném příkladu typu T_Student se jedná o abstraktní třídu bez možnosti tvořit instance Pomocí [NOT] FINAL je možné zakázat či povolit vytváření potomků daného typu –V případě abstraktních tříd je NOT FINAL předpokladem, bez možnosti vytváření potomků nemá abstraktní třída uplatnění

428 DBI026 -DB Aplikace - MFF UK Abstraktní datové typy – SQL:1999 Vytvoření implementace metody se vytváří příkazem CREATE METHOD Poc_Prednasek() FOR T_Student BEGIN … END;

429 DBI026 -DB Aplikace - MFF UK Abstraktní datové typy – SQL:1999 Vytvoření odvozeného typu z typu rodičovského se provede příkazem CREATE TYPE T_PhDStudent UNDER T_Student( … ) [UN]INSTANTIABLE [NOT] FINAL …;

430 DBI026 -DB Aplikace - MFF UK Abstraktní datové typy – SQL:1999 Vytvoření tabulky instancí abstraktního datového typu CREATE TABLE PhD OF T_PhDStudent; Každá řádka je identifikována pomocí omělého klíče (OID – Object IDentificator) generovaného systémem

431 DBI026 -DB Aplikace - MFF UK Reference na ADT – SQL:1999 Na instanci abstraktního datového typu je možné se odkázat pomocí nově zavedeného typu reference Pro každý typ T je automaticky definován typ „reference na T“ REF(T) Povolené hodnoty je možné omezit jen na reference do dané tabulky pomocí REF(T) SCOPE Tabulka

432 DBI026 -DB Aplikace - MFF UK Řádkové typy – SQL:1999 Norma rozlišuje ještě tzv. řádkové typy CREATE ROW TYPE T_Automobil( SPZ VARCHAR(7), Majitel REF(T_Osoba), Typ CHAR(10), Barva CHAR(10), Cena INT );

433 DBI026 -DB Aplikace - MFF UK Řádkové typy – SQL:1999 Tabulka instancí řádkových typů CREATE TABLE Automobily OF T_Automobil( CONSTRAINT Automobily_PK PRIMARY KEY(SPZ) ); Instance nejsou identifikovány pomocí OID

434 DBI026 -DB Aplikace - MFF UK Použití reference – SQL:1999 Pomocí operátoru -> lze procházet přes jednotlivé reference SELECT SPZ, Majitel->Jmeno, … FROM Automobily WHERE Majitel->RokNar >= 1980; Pokud odkazovaný objekt již neexistuje, je reference ve stavu DANGLING Pro test se používá operátor IS [NOT] DANGLING

435 DBI026 -DB Aplikace - MFF UK Řádkové typy – SQL:1999 Řádkové typy mohou být použity i pro typy sloupců CREATE TABLE T( … Auto T_Automobil, … ); Mohou být vnořené do sebe Mohou být použity ad-hoc bez předchozí definice typu: Auto ROW(SPZ VARCHAR(7), …)

436 DBI026 -DB Aplikace - MFF UK Typ pole – SQL:1999 Typ „pole hodnot typu T s maximálním počtem n prvků“ se deklaruje pomocí T ARRAY[n] Např.: Telefony VARCHAR(15) ARRAY[5]

437 DBI026 -DB Aplikace - MFF UK Reprezentace tříd bez objektových rozšíření Uvažujme hierarchii čtyř tříd A, B, C, D viz schéma Používají se tři základní způsoby mapování na relační tabulky Každá má své výhody a nevýhody A aa B bb C cc D dd

438 DBI026 -DB Aplikace - MFF UK Reprezentace tříd bez objektových rozšíření Filtrované (filtered) mapování Jediná tabulka se schématem (ID,aa,bb,cc,dd)  Nemusí se dělat žádná spojení  Komplikace s NOT NULL, cizími klíči  Neefektivní využití místa  Problémy s formulací dotazů B C D A

439 DBI026 -DB Aplikace - MFF UK Reprezentace tříd bez objektových rozšíření Horizontální mapování n tabulek se schématy (ID,aa),(ID,aa,bb), (ID,aa,cc),(ID,aa,bb,dd) Každá obsahuje kompletní instance jedné třídy  Nemusí se dělat spojení pro získání instancí dané třídy  V polymorfních dotazech nutné UNION operace navíc je nutné znát všechny potomky třídy B C D A

440 DBI026 -DB Aplikace - MFF UK Reprezentace tříd bez objektových rozšíření Vertikální mapování n tabulek se schématy (ID,aa),(ID,bb), (ID,cc),(ID,dd) Každá obsahuje kompletní údaje definované v jedné třídě  Snadno se definují cizí klíče na danou třídu  V polymorfních dotazech nutné spojení se všemi tabulkami nadtříd D C B A

441 DBI026 -DB Aplikace - MFF UK Objektové rozšíření Proprietární řešení podpory UDT se v jednotlivých databázích značně liší od normy i mezi sebou navzájem –V Oracle podpora od verze 8i Strukturované uživatelské typy –Od verze 9i včetně jednoduché dědičnosti Pole s proměnnou délkou (VARRAY) Hnízděné tabulky Typ REF

442 DBI026 -DB Aplikace - MFF UK Objektové rozšíření Proprietární řešení podpory UDT se v jednotlivých databázích značně liší od normy i navzájem –V MS SQL podpora od verze SQL Server 2005 Využívá managed kódu.NET platformy

443 DBI026 -DB Aplikace - MFF UK Objektové rozšíření MS SQL Nejprve je nutné napsat definici objektu a metod v některém z.NET jazyků (VB, C#, …) a zkompilovat dll soubor [Serializable] [Microsoft.SqlServer.Server.SqlUse rDefinedType(Format.Native,IsByteO rdered=true)] public struct Point : Inullable {…}

444 DBI026 -DB Aplikace - MFF UK Objektové rozšíření MS SQL Dále je nutné zaregistrovat DLL na serveru CREATE ASSEMBLY Point FROM ’\\Comp\Share\Folder\Poind.dll’ WITH PERMISSION_SET = SAFE;

445 DBI026 -DB Aplikace - MFF UK Objektové rozšíření MS SQL Dále je nutné vytvořit odpovídající typ CREATE TYPE Point EXTERNAL NAME Point.[Point];

446 DBI026 -DB Aplikace - MFF UK Objektové rozšíření MS SQL Typ je možné použít v definici sloupce CREATE TABLE Points ( ID int IDENTITY(1,1) PRIMARY KEY, PointValue Point ) Je možné indexovat buďto binárně přes celý sloupec, nebo přes hodnotu deterministického výrazu nad typem

447 DBI026 -DB Aplikace - MFF UK Objektové rozšíření MS SQL Příklady vkládání dat –INSERT INTO Points (PointValue) VALUES (CONVERT(Point, '3,4')); –INSERT INTO Points (PointValue) VALUES (CONVERT(Point, '1,5')); –INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));

448 DBI026 -DB Aplikace - MFF UK Objektové rozšíření MS SQL Příklady dotazů –SELECT ID, CAST(PointValue AS varchar) FROM Points; –SELECT ID, CONVERT(varchar, PointValue) FROM Points; –SELECT ID, PointValue.X AS xVal, PointValue.Y AS yVal FROM Points;

449 DBI026 -DB Aplikace - MFF UK Objektové rozšíření MS SQL Příklady dotazů s voláním metod –V definici třídy musí být zapnuto IsByteOrdered=true SELECT ID, PointValue.ToString() AS Points FROM Points WHERE PointValue > CONVERT(Point, '2,2'); –SELECT ID, PointValue.X as X, PointValue.Y as Y, PointValue.DistanceFromXY(1,99) AS Dist FROM dbo.Points WHERE PointValue.Distance() > 10;

450 DBI026 -DB Aplikace - MFF UK Objektové rozšíření Oracle strukturované typy Základní typ bez předků CREATE [OR REPLACE] TYPE t {AS|IS} OBJECT ( definice členských atributů, definice členských metod ) [[NOT] FINAL] [[NOT] INSTANTIABLE] Odvozený typ CREATE [OR REPLACE] TYPE t1 UNDER t (…) …; Implementace metod CREATE [OR REPLACE] TYPE BODY t {AS|IS} implementace členských metod END; Zrušení typu DROP TYPE t;

451 DBI026 -DB Aplikace - MFF UK Objektové rozšíření Oracle Více odpovídá normě SQL:1999 Přesto řada menších i větších rozdílů –V definici tříd Nerozlišují se ADT a řádkové typy na vše se používá jednotná deklarace –V definici implementací (převzato z definic těl balíků) –V definicích polí se používá vlastní syntaxe VARRAY –V práci s referencemi –…

452 DBI026 -DB Aplikace - MFF UK Objektové rozšíření Oracle strukturované typy CREATE TYPE T_Adresa AS OBJECT( Ulice VARCHAR2(50), CP VARCHAR2(10), CO VARCHAR2(10), Mesto VARCHAR2(50), PSC VARCHAR2(5) ); CREATE TYPE T_Osoba AS OBJECT( Jmeno VARCHAR2(50), Prijmeni VARCHAR2(50), Adresa T_Adresa );