Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
mgr-szz:in-pos:3-pos [2019/06/08 11:48]
lachmanfrantisek kódování
mgr-szz:in-pos:3-pos [2020/04/12 16:56] (aktuální)
Řádek 15: Řádek 15:
 ===== Vypracování ===== ===== Vypracování =====
  
 +FIXME: doladit, doplnit, zpřehlednit
  
 ==== Kódování dat ==== ==== Kódování dat ====
Řádek 76: Řádek 77:
  
  
-=== Kompresní kódování dat === 
- 
-Cílem: 
- 
-  * minimalizace stupně kódu 
-  * při schopnosti on-line dekódování slov bez vkládání separátorů 
- 
-<box 90% red|Kraftova nerovnost>​ 
-Prefixový q-ární kód s délkami kódových slov d1,​d2,​...,​dm existuje právě tehdy, když je splněna Kraftova nerovnost: 
- 
-<​m>​sum{i=1}{m}{q^{{-d}_{i}}} <= 1</m> 
- 
-</​box>​ 
- 
-<box 90% red|McMillanova veta> 
-Kraftova nerovnost platí pro libovolné jednoznačně dekódovatelné kódování. 
-</​box>​ 
  
 == Eliasovy kódy == == Eliasovy kódy ==
  
  
-<box 90% blue|Eliasův kód>+<box 90% blue|Eliasův kód C1>
  
 Kódování celých čísel u kterých není předem známá horní hranice. Kódování celých čísel u kterých není předem známá horní hranice.
Řádek 103: Řádek 87:
   - Zapíšeme číslo dvojkově.   - Zapíšeme číslo dvojkově.
   - Odečteme 1 od počtu bitů zapsaných v kroku 1 a na začátek připojíme takový počet nul.   - Odečteme 1 od počtu bitů zapsaných v kroku 1 a na začátek připojíme takový počet nul.
- +    - Prefix 0 při dekódování ​určuje délku binární reprezentace.
-</​box>​ +
- +
-<box 90% blue|Eliasův kód C1> +
- +
-Prefix 0 určuje délku binární reprezentace.+
  
 Př.: Př.:
Řádek 125: Řádek 104:
 Př.: Př.:
  
-  * <​m>​C_2(5)</​m>​ = 0<color red>​0</​color>​0<​color red>1</​color>​1+  * <​m>​C_2(5)</​m>​ = <color red>​0</​color>​0<​color red>0</​color>​1<color red>​1</​color>​
  
 </​box>​ </​box>​
Řádek 143: Řádek 122:
   * <​m>​C_3(50)</​m>​ = <color red>​01001</​color>​10010   * <​m>​C_3(50)</​m>​ = <color red>​01001</​color>​10010
 </​box>​ </​box>​
 +
 +=== Kompresní kódování dat ===
 +
 +Cílem:
 +
 +  * minimalizace stupně kódu
 +  * při schopnosti on-line dekódování slov bez vkládání separátorů
 +
 +<box 90% red|Kraftova nerovnost>​
 +Prefixový q-ární kód s délkami kódových slov d1,​d2,​...,​dm existuje právě tehdy, když je splněna Kraftova nerovnost:
 +
 +<​m>​sum{i=1}{m}{q^{{-d}_{i}}} <= 1</m>
 +
 +</​box>​
 +
 +<box 90% red|McMillanova veta>
 +Kraftova nerovnost platí pro libovolné jednoznačně dekódovatelné kódování.
 +</​box>​
 +
  
 == Komprese == == Komprese ==
Řádek 209: Řádek 207:
   * **Slovníkové metody**: Vytváří se slovník dříve přečtených řetězců výstupem jsou indexy do slovníku.   * **Slovníkové metody**: Vytváří se slovník dříve přečtených řetězců výstupem jsou indexy do slovníku.
  
-<box 90% blue|LZ77>​ +<box 90% blue|LZ77 ​(Lempel-Ziv)
-  * Jako slovník se používá jistá zpracovaná část zdrojového textu, vybíraná klouzajícím oknem, kódují se v něm obsažené řetězce proměnlivé.+  * Jako slovník se používá jistá zpracovaná část zdrojového textu, vybíraná klouzajícím oknem, kódují se v něm obsažené řetězce proměnné délky.
   * Výstupem je trojice:   * Výstupem je trojice:
     * ukazatel počátku vzoru ve slovníku     * ukazatel počátku vzoru ve slovníku
Řádek 217: Řádek 215:
 </​box>​ </​box>​
  
-<box 90% blue|LZ78>​+<box 90% blue|LZ78 ​(Lempel-Ziv)>
   * Používá se samostatný dynamicky vytvářený slovník.   * Používá se samostatný dynamicky vytvářený slovník.
   * Výstupem je dvojice:   * Výstupem je dvojice:
Řádek 224: Řádek 222:
 </​box>​ </​box>​
  
-<box 90% blue|LZW>​+<box 90% blue|LZW ​(Lempel-Ziv-Welch)>
   * Používá se samostatný dynamicky vytvářený slovník.   * Používá se samostatný dynamicky vytvářený slovník.
   * Potenciální elementy slovníku jsou v kódové knize přednastaveny.   * Potenciální elementy slovníku jsou v kódové knize přednastaveny.
Řádek 230: Řádek 228:
 </​box>​ </​box>​
  
-=== Organizace souborů dat ===+ 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +==== Organizace souborů dat ===
 + 
 +=== Databáze === 
 + 
 +  * **databáze** = kolekce vzájemně explicitně souvisejících dat 
 +    * spravovaná **systémem řízení báze dat** 
 +  * **pole/​položka/​atribut** základní prvek dat 
 +    * s každým atributem souvisí **datový typ** určující obor možných **hodnot** a **operací** nad nimi. 
 +  * **záznam** = strukturovaná kolekce polí 
 +  * **soubor** = pojmenovaná kolekce příbuzných záznamů 
 + 
 + 
 + 
 +=== Systém souborů === 
 + 
 +  * **soubor** = pojmenovaná kolekce záznamů 
 +    * přístup k souboru jako celku řeší **adresářová služba** systému souborů 
 +    * přístup k datům souboru řeší **organizace souborů** 
 +    * fyzický soubor 
 +        * existuje ve vnější paměti 
 +        * manipuluje s ním OS 
 +        * zaznamenán v adresáři souborů 
 +        * pojmenování vnějším jménem 
 +    * logický soubor 
 +      * souborová struktura z pohledu procesu 
 +      * pojmenování jedinečným vnitřním jménem souboru 
 +      * svázán s fyzickým souborem službou OS 
 + 
 + 
 +  * **Systém souborů (File System)** = Sestava služeb pro manipulaci se soubory. 
 + 
 +<box 90% red|Požadavky na systém souborů>​ 
 +  * umožnit uživatelům/​procesům manipulaci s daty na vnějších pamětech 
 +  * zajišťovat validnost dat, eliminovat ztrátu dat 
 +  * souběžná činnost více uživatelů/​aplikací 
 +  * podpora různých zařízení pomocí definovaného API 
 +</​box>​ 
 + 
 +== Statické x dynamické soubory == 
 + 
 +  * návrh **statických** (neměnných souborů) je snadno dosažitelný 
 +  * návrh **dynamický struktur** je obtížnější 
 +    * dochází k doplňování,​ modifikaci a odstraňování záznamů 
 +    * příklady:​ 
 +      * B-strom 
 +      * dynamický haš soubor 
 +    * založený na rozšiřitelném hašování nebo lineárním hašování 
 + 
 +== Záznamy pevné x proměnné délky == 
 + 
 +  * implicitní (fixní) délka záznamu 
 +    * neuvádějí se oddělovače záznamů 
 +  * variabilní délka záznamu se vyjadřuje:​ 
 +    * explicitně (např. na začátku záznamu) 
 +    * oddělovačem na konci záznamu 
 +    * ukazatelem na záznam uloženým v jiném souboru (indexu) 
 + 
 +Položky: 
 +  * fixní struktura 
 +    * bez oddělovačů 
 +  * variabilní 
 +    * explicitně 
 +    * oddělovačem 
 + 
 +Důvod volitelných délek: 
 +  * obsah proměnné délky 
 +  * seznam hodnot 
 +  * volitelné položky 
 + 
 +<box 90% red|Blok>​ 
 +Samostatně manipulovatelná/​adresovatelná datová jednotka na vnější paměti. 
 + 
 +  * neblokovaný záznam 
 +    * blok obsahuje právě jeden logický záznam 
 +  * blokovaný záznam 
 +    * blok obsahuje celistvý počet logických záznamů 
 +  * přerostlé záznamy 
 +    * záznamy jsou zapisované do bloků nezávisle na hranice 
 +</​box>​ 
 + 
 + 
 +  * **homogenní soubor** 
 +    * hodnoty položek jsou primitivní typy 
 +    * všechny záznamy jsou jednoho typu 
 +    * je deklarovatelný formou S(A1:​D1,​...,​An:​Dn),​ kde Ax je jméno atributu a Dx je doména hodnot 
 +  * **nehomogenní soubor** 
 +    * hodnoty položek jeho záznamů nejsou primitivní typy nebo záznamy nejsou jednoho typu 
 + 
 + 
 +=== Schéma organizace souborů === 
 + 
 + 
 +  * **Logické schéma** 
 +    * logická paměť se člení na logické stránky (sekvenční/​hierarchické uspořádání) 
 +    * logická paměť obsahuje primární soubory i sekundární (pomocné) soubory (indexy, rejstříky) 
 +  * **Fyzické schéma** 
 +    * Zobrazení logických stránek do fyzických stránek konkrétního použitého typu vnější paměti. 
 +  * **Implementační schéma** 
 +    * Zajišťuje alokaci fyzických stránek v použitém zařízení. 
 + 
 +{{:​mgr-szz:​in-pos:​schema-souboru.png?​300|}} 
 + 
 + 
 +==Přístup k souborům== 
 +  * sekvenční 
 +    * aplikovatelné na pásce disku 
 +  * přímý přístup 
 +    * aplikovatelné na disku 
 +    * určení místa pomocí indexu, nebo hašování 
 + 
 +==Formy organizace souborů== 
 +  * hromada 
 +  * sekvenční soubor 
 +  * indexovaný sekvenční soubor 
 +  * indexovaný soubor 
 +  * hašovaný soubor (soubor s přímým přístupem) 
 + 
 + 
 +==Zamykání souborů== 
 +  * **povinné**:​ zamčený soubor je nepřístupný 
 +  * **poradní**:​ proces si může zjistit stav zámku a rozhodnout se 
 + 
 +==Popis dat== 
 +  * **implicitní**:​ aplikace/​uživatel data zná 
 +  * **metadata**:​ uvedená v hlavičce souboru 
 +    * častá standardizace pro třídu aplikací 
 + 
 + 
 +==Adresář== 
 +Kolekce dat obsahující informace o souborech uchovávaných na disku (jméno, typ, adresa, délka, maximální délka, čas posledního přístupu...) 
 + 
 +  * Sám je souborem. 
 + 
 +**Struktury:​** 
 + 
 +<box 90% red|1-úrovňový adresář>​ 
 +Jediný adresář v celém systému. 
 + 
 +  * ➖ neřeší problém unikátnosti pojmenování souboru. 
 +  * ➖ neřeší se problém seskupování souborů 
 +</​box>​ 
 + 
 + 
 +<box 90% red|2-úrovňový adresář>​ 
 +  * ➕ Separace adresářů a uživatelů. (cesta user/​soubor) 
 +  * ➕ Uživatelé mohou stejně pojmenovat různé soubory. 
 +  * ➕ efektivní hledání 
 +  * ➖ neřeší se problém seskupování souborů 
 +  * ➖ nelze sdílet ​  
 +</​box>​ 
 + 
 +<box 90% red|stromová struktura>​ 
 +  * ➕ efektivní hledání hodnoty v uzlu 
 +  * ➕ řeší nezávislé pojmenování i seskupování 
 + 
 +  * **pracovní adresář** = dynamicky určovaný výchozí bod v adresáři 
 +    * **absolutní** x **relativní** cesta 
 + 
 +  * **aliasing** = jeden objekt má více různých jmen 
 + 
 +  * **File System Mounting** = Připojení nového souborového systému do stávající adresářové struktury (bod přidání = **mount point**). 
 +</​box>​ 
 + 
 + 
 +== Řízení přístupu == 
 + 
 +  * volitelné řízení přístupu (vlastní určuje KDO a CO kdo může) 
 +    * UNIX rwx/ugo 
 +    * Access control lists 
 +    * Capability Tickets 
 +  * povinné řízení (práva k souborům prosazována bezpečnostní politikou) 
 + 
 + 
 + 
  
  
 ==== Indexování a hašování ==== ==== Indexování a hašování ====
  
-=== Bitmapové ​indexy ===+  * procházení přímo záznamů je při operacích velice pomalé -- indexy mají řádově menší velikost než samotné záznamy a jejich prohledávání je výrazně rychlejší 
 +  * díky menší velikosti je možné indexy držet v operační paměti bez nutnosti přístupu na disk 
 +  * často stačí pro vyřešení některých dotazů zpřístupnit pouze malou část záznamů -- na základě indexů je možné efektivně provádět filtrování 
 +  * forma indexu: <color blue>{ vyhledávací klíč ; ukazatel na záznam }</​color>​ 
 + 
 + 
 +__typy indexů:​__ 
 + 
 +  * **řádné, lineární indexy**: 
 +    * v tabulce uspořádané dvojice { vyhledávací klíč ; ukazatel na záznam } podle hodnoty vyhl. klíče 
 +  * **hašované indexy** 
 +    * využití hašovací funkce vyhledávacího klíče 
 +  * **stromové indexy** 
 +    * využití grafové struktury strom 
 +  * **indexové bitové mapy** 
 +    * pozice bitů v bitovém vektoru určují lokality záznamů 
 +    * vhodné pro atributy s malým množstvím různých hodnot (uchováváme bitovou mapu pro každou hodnotu) 
 + 
 +Indexy mohou být víceúrovňové -- "index do indexu"​ -- nejnižší úroveň může být přímo primární soubor, výše jsou řídké indexy 
 + 
 +=== Řádné ​indexy === 
 + 
 +Obvykle pokud se mluví o indexech, jsou myšleny řádné. 
 + 
 +**Primární x sekundární** 
 +  * **primární index** 
 +    * podle jeho klíče je uspořádán primární soubor se záznamy 
 +    * může být hustý nebo řídký 
 +  * sekundární index 
 +    * určený pro dotazy založené na jiném vyhledávacím klíči než na primárním 
 +    * musí být hustý 
 + 
 +**Hustý x řídký** 
 + 
 +  * **hustý** 
 +    * indexový záznam pro každou hodnotu vyhledávacího klíče. 
 +    * Typicky bývá uspořádán podle hodnoty klíče 
 + 
 +{{:​home:​prog:​husty.jpg?​500|}} 
 + 
 +  * **řídký** 
 +    * indexový záznam pouze pro některé hodnoty vyhledávacího klíče 
 +    * použitelné pouze v případě, kdy je soubor podle tohoto klíče uspořádán 
 + 
 +{{:​home:​prog:​ridky.jpg?​500|}} 
 + 
 +<box 90% orange | Příklad>​ 
 +**Uložený soubor se záznamy:​** 
 + 
 +^ ID (2B) ^ Jméno (20B)      ^ Rok narození (2B)       ^ Místo narození (16B)          ^ Telefon (4B) ^ Bydliště (16B) ^ 
 +| 1 | Bílá Alena | 1972 | Ostrava | xxxxxxxx | Brno | 
 +| 2 | Novák Jan | 1952 | Praha | 123456789| Kladno | 
 +| 3 | Novotný Tomáš | 1987 | Brno | 565656565| Vyškov | 
 +| 4 | Procházka Petr | 1964 | Brno | 100001011| Řestoky | 
 + 
 +**Hustý index pro atribut jméno:** 
 +^ Jméno ^ ID ^ 
 +|Bílá Alena|1| 
 +|Novák Jan|2| 
 +|Novotný Tomáš|3| 
 +|Procházka Petr|4| 
 +Pokud chceme vyhledat místo narození Tomáše Novotného, pak je při sekvenčním prohledávání nutné načíst 2 · (2 B + 20 B + 2 B + 16 B + 4 B + 16 B) + 2 B + 20 B + 2 B + 16 B = 160 B. Při použití hustého indexu stačí načíst 3 · (20 B + 2 B) + 2 B + 20 B + 2 B + 16 B = 106 B. Pokud je index uložen v operační paměti, pak v obou případech stačí pouze jeden přístup na disk, avšak v prvním případě bude třeba číst výrazně více dat. 
 + 
 +**Řídký index pro atribut jméno:** 
 +^ Jméno ^ ID ^ 
 +|Bílá Alena|1| 
 +|Novotný Tomáš|3| 
 +Pokud je požadavek na vyhledání například Jana Nováka, nalezne se poslední záznam v uspořádání před ním (Alena Bílá) a dál se postupuje sekvenčně. 
 + 
 +**Sekundární index pro atribut místo narození:​** 
 +^ Místo narození ^ ID ^ 
 +|Brno|3,​4| 
 +|Ostrava|1| 
 +|Praha|2| 
 +</​box>​ 
 + 
 + 
 +=== Hašování === 
 + 
 + 
 +<box 90% round blue | Definice>​ 
 + 
 +**hašovací funkce (obecně)** = Funkce, která mapuje libovolně velký vstup na výstup fixní délky a není prostá. 
 +**hašovací funkce (ve smyslu organizace souborů)** = Funkce řešící přístup k záznamům souboru s konstantní složitostí. 
 +**kolize** = situace, kdy je pro více záznamů spočítána stejná adresa 
 +  * při nalezení kolize umisťujeme nový prvek: 
 +    * ve stejné paměti (**otevřené adresování**) 
 +      * lineární, kvadratické adresování 
 +      * řetězení kolizí 
 +      * násobné hašování 
 +    * v jiné paměťové oblasti (**closed addressing**) 
 +      * umístění do **kapes**  
 +</​box>​ 
 + 
 + 
 +Požadované vlastnosti hašovací funkce: 
 +  * je deterministická 
 +  * je rychlá ​  
 +  * vypočítává se z hodnot všech nebo alespoň většiny bitů klíče 
 +  * pokrývá cílový prostor rovnoměrně 
 +  * drobná změna ve vstupu vede k výrazné změně ve výstupu 
 +  * prostá = //​perfektní hašování//​ 
 + 
 +== Statické hašování == 
 +  * používá se u souborů, které procházejí jen minimem změn 
 +  * případné změny mohou negativně ovlivnit efektivitu hašování 
 +    * pokud se sejde na stejné adrese více záznamů než je kapacita bucketu, vyhledávání v rámci těchto záznamů má lineární složitost 
 + 
 +== Dynamické hašování == 
 + 
 +<box 90% blue|Rozšiřitelné hašování>​ 
 + 
 +  * k výpočtu adresy se používá pouze prvních //i// bitů z výstupu hašovací funkce; toto //i// se dynamicky mění -- pokud je potřeba více adres, tak se zvyšuje, naopak při malém počtu se //i// zmenšuje 
 +  * používá se u souborů s proměnným počtem záznamů 
 +  * buckety jsou naplněné rovnoměrně -- pokud jsou plné, tak se štěpí, pokud jsou prázdné, tak se spojují 
 + 
 +{{:​home:​prog:​rozhas.jpg|}} 
 + 
 +  * hašovací funkce rozmisťuje záznamy do kapes (kapsa = záznamy s jistou podmnožinou klíčů, vymezuje je hašovací funkce) 
 +  * jako index v adresáři kapes se používá dynamicky určovaný prefix výsledku hašovací funkce **//​h//​(//​k//​)** 
 +  * délku indexu vymezuje globální hloubka adresy kapsy 
 +  * štěpení 
 +    * globální hloubka > lokální hloubka -- na blok ukazuje více ukazatelů, jednoduše se rozdělí na dva 
 +    * globální hloubka = lokální hloubka -- musí vzniknout nová kapsa a také se zdvojnásobí rozměr adresáře kapes 
 +</​box>​ 
 + 
 + 
 +<box 90% blue|Lineární hašování>​ 
 +  * řeší nedostatky rozšiřitelného hašování za cenu vyšší režie dané manipulací s **přetokovými kapsami** 
 +  * počet kapes udržuje tak, aby byly naplněny z např. 80 % 
 +  * rozdíl oproti rozšiřitelnému hašování:​ **nemusí se vytvářet ani udržovat adresář kapes**, přesto počet kapes roste **lineárně**. 
 +</​box>​ 
 + 
 + 
  
-=== Dynamické hašování === 
  
 ==== Dotazy ==== ==== Dotazy ====
  
-=== Vyhodnocení ​dotazů ​===+=== Vyhodnocení ​dotazu ​=== 
 + 
 +Postup zpracování a optimalizace dotazu: 
 + 
 +  - Převod dotazu na **syntaktický strom** pomocí parseru. 
 +  - Převod na **logický plán** ve formě výrazů relační algebry. 
 +  - Aplikací transformačních pravidel (viz níže) vznikne **vylepšený logický plán** 
 +  - Odhad ceny provedení na základě různých statistik (počet záznamů, velikost záznamů, počet unikátních hodnot, ...). 
 +  - **logický plán dotazu s velikostmi** - v PostgreSQL lze zobrazit příkazem EXPLAIN 
 +  - Transformace na **fyzický plán** určující pořadí operací. 
 +  - Výběr nejlevnějšího **fyzické plánu** (velikost výsledků, počet V/V operací). 
 +  - Vyhodnocení vybraného **fyzického plánu**.
  
 === Transformační pravidla === === Transformační pravidla ===
 +
 += Transformační vztahy relační algebry zachovávající výsledek. Mohou ale zefektivnit samotné vyhodnocování. ​
 +
 +
 +  * Přirozené spojení + kartézský součin a sjednocení + průnik
 +    * Protože jsou všechny atributy zachovány, není pořadí důležité.
 +
 +  * Selekce
 +    * Konjunkci podmínek lze nahradit dvěma následnými selekcemi, nebo průnikem dvou selekcí.
 +    * Disjunkci podmínek lze nahradit sjednocením dvou selekcí.
 +    * Relace jsou multimnožiny!
 +
 +  * Kombinace selekce a přirozeného spojení
 +    * Pokud selekce závisí jen na atributech jednoho z členů, pořadí operací neovlivní výsledek.
 +
 +  * Vhodné transformace
 +    * selekce co nejdříve; nejblíže relacím
 +    * projekce co nejdříve; nejblíže relacím
 +    * eliminace společných podvýrazů
 +    * eliminace duplicit
  
 === Statistiky a odhady === === Statistiky a odhady ===
 +
 +  * odhad velikosti výsledku operace
 +    * počet záznamů
 +    * velikost záznamů
 +    * počet unikátních hodnot
 +    * Pro dobrý odhad jsou nutné aktuální hodnoty. => Aktualizace statistik ve vhodných intervalech (aktuálnost x zátěž).
 +  * odhad počtu V/V operací
 +    * cena všech operací (odhad ceny operace = počet čtení a zápisů z disku)
 +    * vstup se čte ze vstupu
 +    * výstup zůstává v operační paměti
 +    * operace CPU
 +    * komunikace po síti
 +
 +
 +<box 90% blue|Koncept Iterátoru>​
 +  * Open: inicializace operace
 +    * příprava před vracením řádků výsledku
 +  * GetNext: vrácení dalšího řádku výsledku
 +  * Close: ukončení operace
 +    * uvolnění dočasné paměti
 +
 +  * ➕ výsledek nemusí být vygenerován „naráz“
 +  * ➕ výsledek nezabírá paměť
 +  * ➕ výsledek nemusí být ukládán
 +  * ➕ operace lze řetězit (pipelining)
 +</​box>​
  
 === Optimalizace dotazů a schématu === === Optimalizace dotazů a schématu ===
 +
 +== Ladění dotazu ==
 +
 +  * Lokální změna = přepsání dotazu
 +    * První přístup ke zrychlení dotazu
 +    * Ovlivní pouze daný dotaz
 +  * Globální změna
 +    * Vytvoření indexu
 +    * Změna schématu
 +    * Rozdělení transakcí
 +
 +
 +  * Techniky přepsání dotazu
 +    * Rušení nadbytečných DISTINCT
 +    * (Korelované) poddotazy
 +    * Dočasné tabulky
 +    * Používání HAVING
 +    * Používání pohledů (VIEW)
 +    * Použití indexů
 +    * Uložené pohledy (materializedviews)
 +
 +
 +  * Vytvoření indexu
 +    * ➕ Zrychlí SELECT
 +    * ➖ Zpomalí INSERT, UPDATE, DELETE
 +      * Index se musí aktualizovat
 +
 +
 +== Optimalizace schématu ==
 +
 +
 +  * Funkční závislost (A -> B)
 +    * = Hodnoty atributu B zjistíme, pokud známe hodnoty atributů A
 +
 +
 +  * Normální formy
 +    * Normalizace = převod do BCNF (3NF)
 +
 +
 +<box 90% red|1NF>
 +Všechny atributy jsou atomické.
 +</​box>​
 +
 +<box 90% red|2NF>
 +Všechny atributy závisí na celém klíči.
 +</​box>​
 +
 +<box 90% red|3NF>
 +Všechny atributy závisí přímo na klíči.
 +  * Není tranzitivní závislost.
 +</​box>​
 +
 +<box 90% red|Boyce-Codd NF>
 +Pro všechny funkční závislosti A->B platí jedno z následujících:​
 +  * A->B je triviální funkční závislost (B je podmnožinou A)
 +  * A je superklíčem schématu
 +</​box>​
 +
 +
 +<box 90% blue|klíče>​
 +**super klíč** = množina atributů jednoznačně určující každý záznam
 +**kandidátský klíč** = super klíč bez nadbytečných atributů
 +**primární klíč** = právě jeden vybraný kandidátský klíč
 +</​box>​
 +
 +
 +
 +
  
 ==== Zabezpečení báze dat ==== ==== Zabezpečení báze dat ====
  
 === Přístupová práva === === Přístupová práva ===
 +
 +  * Analogie se souborovým systémem, ale jemnější.
 +  * Specifická práva pro:
 +    * tabulky
 +    * pohledy
 +    * sekvence
 +    * schéma
 +    * databáze
 +    * procedury
 +  * Pohledy (views)
 +    * základní nástroj pro řízení přístupu
 +  * Subjektem jsou obvykle uživatelé a skupiny
 +    * Často nazýváno jako authorization id nebo role
 +    * Subjekt „ostatní“ je označován jako PUBLIC
 +    * Povolení přístupu pro PUBLIC znamená povolení přístupu komukoli.
 +
 +  * Uložené procedury
 +    * kontext provádění:​
 +      * vlastník
 +      * volající
 +      * "​určený uživatel"​
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
  
 ==== Transakce ==== ==== Transakce ====
 +
 +
 +Transakce je posloupnost operací (DML příkazů),​ které převedou datové schéma z jednoho konzistentního stavu do druhého (zpřístupňuje a aktualizuje data). Platí o ní, že je ACID:
 +
 +  *  //​**A**tomic (atomičnost)//​ – transakce se celá provede nebo se celá zruší
 +  *  //​**C**onsistency (konzistence)//​ – po dokončení transakce je databáze konzistentní
 +  *  //​**I**solation (izolovanost)//​ – různé transakce o sobě vzájemně nevědí
 +  *  //​**D**urability (trvanlivost)//​ – po ukončení transakce jsou data trvale uložena
 +
 +Více transakcí může být spouštěno současně, může však dojít k uváznutí (deadlocku). Chronologické pořadí provádění instrukcí souběžných transakcí je předem určeno pomocí plánu.
 +
 +Každá transakce může nabývat těchto stavů: aktivní, částečně potvrzená, chybující,​ zrušená a potvrzená. Pokud byla transakce zrušena, je možné ji znovu spustit (nedošlo-li k logické chybě) nebo zamítnout.
 +
 +
  
 === Řízení souběžných transakcí === === Řízení souběžných transakcí ===
 +
 +Plánovače
 +  * sériový plán: transakce jdou po sobě
 +  * serializovatelný plán: ekvivalentní sériovému
 +  * Plánovače:​
 +    * **optimistické** (předpokládají málo konfliktů a nechávají věci plynout, při selhání transakce vracejí, ruší)
 +    * **pesimistické** (předpokládají hodně konfliktů, předchází jim silnou serializací)
 +
 +Souběžné zpracování (zajišťuje izolovanost)
 +  * zámky: ​
 +     * exkluzivní -- jen jedna transakce čte a píše, ​
 +     * sdílený (shared) -- více čtení, žádný write
 +     * (v ideálním případě se rovná idální serializaci)
 +     * zámky zpravuje správce zámků a transakce s mím mluví protokolem
 +        * Dvoufázový transakční protokol na bázi zamykání (růstová fáze - zamykání, couvací fáze - uvolňování po provedení transakce)
 +        * Grafový (stromový) protokol řízení souběhu transakcí (jednofázový,​ zná pořadí přístupu transakcí k datům)
 +        * oba pesimistické plánovače
 +     * správa zámků představuje netriviální režii.
 +  * Časová razítka -- jiné řešení transakce mají čas, kdy vznikly. Nejstarší jde nejdřív. Pesimistické plánování
 +  * Protokol řízení souběhu transakcí na bázi validace (optimistický plánovač). Na konci transakce se zvaliduje, zda došlo ke konfliktu, pokud ano, jedna transakce se abortuje.
 +
 +
 +
  
 === Systémy obnovy transakcí po výpadku === === Systémy obnovy transakcí po výpadku ===
  
 +  * Klasifikace výpadků
 +     * výpadek transakce
 +       * logická chyba (např. data nenalezena)
 +       * systémová chyba (např. deadlock)
 +     * zhroucení systému
 +     * porucha disku
 +
 +Pro obnovu výpadku požadujeme,​ aby tranakce byly atomické, databáze konzistentní.
 +
 +Žurnálování (log, deník)
 +  * O prováděných tranakcích (a jejích operacích) si vedu záznam v žurnálu.
 +  * Při výpadku můžu použít žurnál k REDO, UNDO...
 +  * Místo žurnálování můžu použít redundanci (RAID)
 +
 +== Undo logging ==
 +  * V případě výpadku se některé operace zruší (z nedokončených transakcí)
 +  * Pro každou akci vytvoř v žurnálu záznam obsahující starou hodnotu ​
 +  * Před změnou x na disku musí být na disku záznamy žurnálu týkající se x - Tzv. write ahead logging (WAL)
 +  * Před vytvořením záznamu <​commit>​ v žurnálu musí být všechny zápisy transakce uloženy na disku.
 +
 +== Redo logging ==
 +  * V případě výpadku se některé operace dokončí
 +  * Změny později provedené transakcí jsou ukládány Tj. při potvrzení (commit) -- Ušetření zápisů na disk
 +  * Při obnově jsou ignorovány nedokončené transakce
 +  * Vyžaduje uložení žurnálu před uložením změn v DB.
 +
 +== Check points ==
  
 +  * pravidelné ukládání kontrolních stavů databáze pro případné pozdější obnovení
 +  * něco jako otisky DB , aby se při obnově nemusely dělat od začátku
 +  * také dálají redo, undo
  
  
Řádek 266: Řádek 814:
   * slidy PV062 (verze jaro 2015)   * slidy PV062 (verze jaro 2015)
   * slidy PA150 (podzim 2016)   * slidy PA150 (podzim 2016)
 +  * slidy pa152 (jaro 2019)
 +  * http://​statnice.dqd.cz/​home:​prog:​ap12
 +  * http://​statnice.dqd.cz/​mgr-szz:​in-bit:​14-bit
mgr-szz/in-pos/3-pos.1559987338.txt.gz · Poslední úprava: 2020/04/12 16:56 (upraveno mimo DokuWiki)
Nahoru
CC Attribution-Noncommercial-Share Alike 4.0 International
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0