Otázky
1. Co je složený index? Kdy jej používáme? Výhody, nevýhody a uveď příklad. + Kdy nevhodné p.
Složený index na dvou (a více?) klíčích tabulky. Rychlejší, optimalizované dotazy. Efektivní vyhledávání, třídění. Avšak změny dat vyžadují i aktualizaci indexů, taky zabírají msto na disku. Např. first a last name employees
a) Špatná selektivita sloupců:
Pokud sloupce, na kterých je vytvořen složený index, mají nízkou selektivitu (malý počet unikátních hodnot), index může být méně účinný a může způsobit zbytečné zvětšení velikosti indexu a zpomalení operací.
b) Časté aktualizace:
Pokud jsou sloupce v indexu často aktualizovány, může to vést k fragmentaci indexu a snížení výkonu operací čtení a zápisu. Složené indexy jsou citlivější na aktualizace než jednoduché indexy.
c) Nadbytečnost:
V některých případech může být složený index nadbytečný, pokud není použit pro optimalizaci dotazů. Pokud dotazy neprovádějí filtrování nebo třídění na základě všech sloupců v indexu, může být složený index zbytečný a zbytečně zvětšovat velikost databáze.
d) Složitost správy:
Přidání složených indexů může zvýšit složitost správy databáze a může zpomalit operace zápisu a aktualizace dat. Složené indexy vyžadují sledování a správu vícero sloupců, což může být náročné.
e) Omezení paměti a výkonu:
V případech, kdy je k dispozici omezené množství paměti nebo kdy jsou výkonnostní požadavky vysoké, může použití složeného indexu zpomalit databázové operace a snížit efektivitu využití paměti.
!!!Problém: Při indexu login,jmeno a dotazu na jméno, bude docházet k sekvenčnímu průchodu!
2. Popiš objektivně-relační datový model. 5 rysů oproti relačnimu modelu a příklady těch rysů.
a) Podpora uživatelských datových typů
Vlastní datové typy - rozšíření oproti tradičním předdefinovaným typům v relačním modelu. Místo použití primitivních datových typů jako INTEGER nebo VARCHAR, můžete vytvořit vlastní typ ADDRESS, který bude obsahovat složky jako street, city, a zipcode.
b) Podpora objektových tříd a dědičnosti
Koncepty tříd a dědičnosti - umožňuje hierarchické struktury dat. Třída Vehicle a od ní odvodit třídy Car a Truck, které budou dědit vlastnosti Vehicle, ale mohou mít také své specifické vlastnosti.
c) Metody a funkce spojené s datovými typy
Umožňuje definovat metody a funkce, které jsou spojené s uživatelskými datovými typy. Pro typ ADDRESS můžete definovat metodu full_address(), která vrátí kompletní adresu jako řetězec.
d) Podpora složených datových struktur
Pole, seznamy nebo mapy, přímo v rámci datových typů. Můžete mít sloupec typu INTEGER ARRAY, který bude obsahovat pole čísel, nebo sloupec typu MAP<STRING, STRING>, který bude obsahovat mapu klíč-hodnota.
e) Referenční integrita a podpora odkazů
Podobně jako relační model, i objektivně-relační model podporuje referenční integritu, ale navíc umožňuje práci s odkazy (pointers nebo references) na objekty. Můžete mít sloupec typu REFERENCE TO Vehicle, který bude odkazovat na instanci třídy Vehicle, což umožní snadnější správu vztahů mezi objekty.
3. Minispecifikace
GetPumpLocation(id_pump, p_name):
- Spustí transakci:
start transaction
- Zkontroluje, zda p_name je, či není NULL a informuje usera skrze konzoli + ukázka erroru:
IF p_name IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('No problems here.');
ELSE
p_name := 'UNDEFINED';
RAISE_APPLICATION_ERROR(-20001, 'There is something wrong with the Consumable field!');
END IF;
- Přiřadí pumpu ke kroku + přiřadí lokaci (do OUT proměnné):
UPDATE Grinding_Polishing
SET id_used_pump = id_pump;
SELECT location
INTO f_location
FROM Pumps
WHERE id_pump = your_id_pump;
out_location := f_location;
Změní hodnotu „filled“ pumpy (zde 1, ekvivalent k bool. „True“):
UPDATE Pumps
SET filled = 1
WHERE Pumps.id_pump = id_pump;
- Ukončí transakci:
commit;
return 1;
4. K čemu slouží v databázových systémech log soubor? Proč je efektivnější zápis do logu než do databáze?
a) Obnova databáze po selhání:
V případě havárie systému nebo výpadku napájení může být databáze obnovena pomocí log souborů. Log obsahuje záznamy o všech transakcích, které byly provedeny, a může být použit k obnově databáze do konzistentního stavu.
b) Transakční zpracování:
Log soubory umožňují implementaci transakčního zpracování, které zajišťuje vlastnosti ACID (Atomicity, Consistency, Isolation, Durability). Pokud transakce selže, lze pomocí logu provést rollback změn.
c) Replikace:
V prostředích s replikovanými databázemi jsou log soubory používány k synchronizaci změn mezi primární a sekundární databází.
d) Auditing a sledování:
Log soubory mohou být použity pro auditní účely a sledování změn provedených na databázi, což je důležité pro bezpečnost a dodržování předpisů.
a) Sekvenční zápis vs. náhodný zápis:
Log soubory jsou obvykle zapisovány sekvenčně, což je rychlejší než náhodné zápisy do databázových tabulek.
Sekvenční zápis je efektivnější pro disky, protože minimalizuje pohyby diskových hlav.
b) Minimalizace I/O operací:
Zápis do logu je typicky méně náročný na I/O operace ve srovnání s přímým zápisem do databázových tabulek. Logování umožňuje seskupit změny a provést je najednou, což snižuje celkový počet I/O operací.
c) Asynchronní zápis:
Po zapsání změn do logu může databázový systém provádět zápisy do hlavních databázových tabulek asynchronně. To znamená, že systém může pokračovat ve zpracovávání dalších operací, zatímco změny jsou aplikovány na tabulky na pozadí.
d) Zajištění trvanlivosti (Durability):
Zapsání změn do logu zajišťuje, že změny přežijí havárii systému. Jakmile je změna zapsána do logu, může být později aplikována na databázi, což zajišťuje trvanlivost transakcí.
e) Snazší implementace rollbacku:
Pokud dojde k selhání transakce, log umožňuje snadné provedení rollbacku změn. Systém jednoduše "odroluje" změny zaznamenané v logu, aniž by musel přistupovat k hlavní databázi.
5. Popiš proběh souběhu zvaný výskyt fantomů, uveď příklad.
Problém, když běží dvě transakce v jednu chvíli, navzájem se ovlivní. Transakce A přečte počet řádků, transakce B provede insert nebo delete a transakce A následně přečte jiný počet řádků, jak předtím.
- A:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; <br/>
SELECT COUNT(*) FROM employees WHERE department_id = 10;
- B:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
INSERT INTO employees (employee_id, first_name, last_name, department_id, hire_date)
VALUES (4, 'Bob', 'Green', 10, DATE '2021-07-30');
COMMIT;