IN-POS 3. Databáze
Zadání
Kódování dat, kompresní kódování dat, organizace souborů dat.
Indexování a hašování, bitmapové indexy, dynamické hašování.
Vyhodnocení dotazů, transformační pravidla, statistiky a odhady.
Optimalizace dotazů a schématu.
Zabezpečení báze dat, přístupová práva.
Transakce, řízení souběžných transakcí, systémy obnovy transakcí po výpadku.
Vypracování
: doladit, doplnit, zpřehlednit
Kódování dat
Kódování = Proces nahrazování symbolů (resp. jejich posloupností) zprávy symboly (resp. jejich posloupností) nabývajících znaků cílové (kódovací) abecedy.
Množství informace
Množství získané informace odpovídá velikosti odstraněné neurčitosti získáním informace.
Pro je jednotkou bit.
Entropie
Neurčitost zdroje zprávy je rovna množství informace v ní obsažení. (Neurčitost je přijetím zprávy odstraněna.)
Abeceda = konečná množina znaků (prvků abecedy, písmen,…)
Kódové slovo = slovo (posloupnost znaků) v kódové abecedě
Kódování = funkce
Kód = kódem daného kódování se rozumí obor hodnot zobrazení K
Klasifikace kódů
Kód s kódovými slovy pevné délky.
Kód s kódovými slovy proměnlivé délky.
stupeň (rate) kódu = průměrný počet bitů použitých pro kódování zdrojových znaků v tomto kódu.
optimální kód má stupeň minimálně převyšující množství informace obsažené v symbole zdrojových zpráv.
Nesingulární kód = jeho kódovací funkce je prostá
Jednoznačně dekódovatelný kód = Všechny možné řetězce jsou jednoznačně dekódovatelné
Prefixový kód = Bezprostředně jednoznačně dekódovatelný kód.
Minimální kódování
Př.:
A = 1 , C = 01 , G = 000 a T =001
např. řetětzec 8 symbolů ACATGAAC je kódovaný 14 bity:
10110010001101
tj. v průměru
b/symbol
Eliasovy kódy
Eliasův kód C1
Kódování celých čísel u kterých není předem známá horní hranice.
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.
Prefix 0 při dekódování určuje délku binární reprezentace.
Př.:
Eliasův kód C2
Přeuspořádání C1.
Př.:
=
00
01
1
Eliasův kód C3
Vyjádření délky kódového slova pomocí C2.
Př.:
(
)
= 6 bitů
=
00110
=
01
00
1
=
0100110010
Kompresní kódování dat
Cílem:
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:
McMillanova veta
Kraftova nerovnost platí pro libovolné jednoznačně dekódovatelné kódování.
Komprese
Komprese = Kódování zprávy délky P(X) [b] na zprávu délky L(X) [b]
Kompresní poměr = L(X)/O(X)
Kompresní faktor = O(X)/L(X)
Kompresní zisk = (O(X)-L(X))/O(X)
Redundance zprávy = R(X) = O(X) - H(X)
Redundance komprimované zprávy = R'(X) = L(X) - H(X)
Statická komprese
Adaptivní komprese
Fyzická komprese
Logická komprese
Kompresní metody
Základní metody
Brailovo písmo
Baudotův kód: 5bit kód, číslicová/písmenová změna
RLE (Run Length Encoding): náhrada opakujících se sousedních symbolů čítačem opakování a specifikací opakovaného symbolu
Kódování podle Bentleyho (Move-to-Front Coding): Dynamicky se tvořící abeceda
Aritmetické kódování
Nekóduje jednotlivé symboly zprávy, ale používá jedno kódové slovo pro zakódování celé zprávy.
LZW (Lempel-Ziv-Welch)
Používá se samostatný dynamicky vytvářený slovník.
Potenciální elementy slovníku jsou v kódové knize přednastaveny.
Výstupem je jediný údaj – index vzoru ve slovníku.
Organizace souborů dat
Databáze
databáze = kolekce vzájemně explicitně souvisejících dat
pole/položka/atribut základní prvek dat
záznam = strukturovaná kolekce polí
soubor = pojmenovaná kolekce příbuzných záznamů
Systém souborů
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
Statické x dynamické soubory
Záznamy pevné x proměnné délky
Položky:
fixní struktura
variabilní
Důvod volitelných délek:
obsah proměnné délky
seznam hodnot
volitelné položky
Blok
Samostatně manipulovatelná/adresovatelná datová jednotka na vnější paměti.
neblokovaný záznam
blokovaný záznam
přerostlé záznamy
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
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
Implementační schéma
Přístup k souborům
Zamykání souborů
Popis dat
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…)
Struktury:
1-úrovňový adresář
Jediný adresář v celém systému.
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
Řízení přístupu
Indexování a hašování
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: { vyhledávací klíč ; ukazatel na záznam }
typy indexů:
řádné, lineární indexy:
hašované indexy
stromové indexy
indexové bitové mapy
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
sekundární index
Hustý x řídký
ří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
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 |
Hašování
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
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í
Dynamické hašování
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í
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
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ě.
Dotazy
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í vztahy relační algebry zachovávající výsledek. Mohou ale zefektivnit samotné vyhodnocování.
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!
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
Koncept Iterátoru
➕ 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)
Optimalizace dotazů a schématu
Ladění dotazu
Optimalizace schématu
1NF
Všechny atributy jsou atomické.
2NF
Všechny atributy závisí na celém klíči.
3NF
Všechny atributy závisí přímo na klíči.
Boyce-Codd NF
Pro všechny funkční závislosti A→B platí jedno z následujících:
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íč
Zabezpečení báze dat
Přístupová práva
Uložené procedury
kontext provádění:
vlastník
volající
„určený uživatel“
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:
Atomic (atomičnost) – transakce se celá provede nebo se celá zruší
Consistency (konzistence) – po dokončení transakce je databáze konzistentní
Isolation (izolovanost) – různé transakce o sobě vzájemně nevědí
Durability (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í
Plánovače
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
Klasifikace výpadků
výpadek transakce
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
Zdroje
Nahoru