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

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

Databázové systémy I Přednáška č. 8 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky

Podobné prezentace


Prezentace na téma: "Databázové systémy I Přednáška č. 8 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky"— Transkript prezentace:

1 Databázové systémy I Přednáška č. 8 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky

2 Obsah – Sekvence – Indexy Databázové systémy 1 - př. 8 2

3 Sekvence -umožňují generovat jedinečné identifikátory, například hodnoty primárního klíče tabulek, -databázová platforma Oracle používá tzv. sekvence, (v MySQL je např. volba autoincrement pro vybraný sloupec tabulky) -při použití sekvence například pro generování primárního klíče je dobré si uvědomit, zda sekvenčně zvolený (umělý) klíč je správné řešení (někdy je vhodné použít již existující primární klíče např. z evidence obyvatel, nebo přirozené klíče). Databázové systémy 1 - př. 8 3

4 Syntaxe příkazu CREATE SEQUENCE CREATE SEQUENCE [START WITH ] [INCREMENT BY ] [MAXVALUE ] [MINVALUE ] [CYCLE | NOCYCLE ] [CACHE | NOCACHE ] START WITH počáteční hodnota generátoru, výchozí 1 INCREMENT BY interval mezi dvěma za sebou generovanými čísly, výchozí 1 CYCLE umožňuje opakované generování hodnot MAXVALUE, MINVALUE maximální a minimální hodnota CACHE kolik hodnot se generuje do paměti, výchozí 20 (po restartu databázového serveru hodnoty z paměti zmizí – nevyužité hodnoty z paměti nebudou vráceny) Databázové systémy 1 - př. 8 4

5 Použití sekvencí Existují 2 pseudosloupce, které umožňují využití sekvence:. NEXTVAL Vygeneruje a vrátí další hodnotu sekvence. CURRVAL Vrátí aktuální hodnotu sekvence (ta musí být předtím aspoň jednou inicializována použitím. NEXTVAL) Příklad: CREATE SEQUENCE seq_studenti_id; INSERT INTO Studenti(id, jmeno, prijmeni) VALUES (seq_studenti_id.NEXTVAL, 'Karel', 'Nový'); INSERT INTO Studenti(id, jmeno, prijmeni) VALUES (seq_studenti_id.NEXTVAL, 'Petr‚ 'Blažek'); Databázové systémy 1 - př. 8 5

6 Použití sekvencí Příklad: CREATE SEQUENCE seq_cyklus MINVALUE 2 MAXVALUE 5 CYCLE NOCACHE; bude postupně generovat hodnoty 2, 3, 4, 5, 2, 3, 4, 5, 2 … CREATE SEQUENCE seq_st_inc START WITH 100 INCREMENT BY 200; bude postupně generovat hodnoty 100, 300, 500, 700, 900, 1100, 1300 … Databázové systémy 1 - př. 8 6

7 Syntaxe příkazu DROP SEQUENCE Odstranění sekvence: DROP SEQUENCE Příklad: DROP SEQUENCE seq_studenti_id; Databázové systémy 1 - př. 8 7

8 Indexy Fakt: -záznamy v tabulkách ukládány neuspořádaně, nejčastěji v pořadí, v jakém byly do tabulky vkládány, Bez indexů (informace níže platí pro sloupec s omezením UNIQUE): -záznamy hledáme od prvního záznamu postupně, dokud hledaný nenajdeme, -v průměru vždy prohledáme asi polovinu záznamů, než najdeme jeden hledaný záznam -tyto problémy řeší přidání dalšího objektu – INDEXu, ten obsahuje informace o tom, kde se jaký záznam nachází (podle hodnoty v indexovaném sloupci). Databázové systémy 1 - př. 8 8

9 Indexy S indexy: -při hledání podle indexového sloupce stačí najít údaj v indexu a odtud získat ROWID (jedinečný identifikátor, který databázový server přiřadí každému záznamu v tabulce) a podle něho najít požadovaný záznam, v obecném případě takových řádků může být více splňujících danou podmínku -moderní dtb. servery obvykle používají stromovou strukturu indexů, například B - stromy, -průchod uspořádaným stromem je v průměru výrazně kratší než sekvenční hledání v neuspořádaném poli. Databázové systémy 1 - př. 8 9

10 B - strom B-strom je vyvážený strom. Tato struktura je často používána v aplikacích, kdy není celá struktura uložena v paměti RAM, ale v nějaké sekundární paměti, jako je pevný disk (například databáze). Protože přístup do tohoto typu paměti je náročný na čas (hlavně vyhledání náhodné položky), snažíme se minimalizovat počet přístupů. B-strom řádu n je takový strom, kde: všechny listy (tj. uzly, které nemají žádné potomky) jsou na stejné úrovní (ve stejné hloubce). kořen má nejvýše n potomků, spodní hranice není omezena. všechny uzly kromě kořene mají maximálně n a minimálně n/2 - 1 potomků Databázové systémy 1 - př. 8 10

11 B - strom Pokud chceme vložit nebo smazat data (klíče) z uzlu, změní se tím počet potomků tohoto uzlu. Aby se dodržel rozsah daný řádem stromu, vnitřní uzly se v případě potřeby rozdělují či slučují. Protože počet potomků každého uzlu je omezený, není potřeba vyvažovat tento strom tak často jako jiné typy automaticky vyvažovaných stromů. Jelikož strom je málokdy zcela zaplněný, musíme počítat s tím, že může docházet k nevyužití veškeré obsazené paměti (naštěstí to většinou není překážkou). Strom je vyvažován požadavkem, aby byly všechny listy na stejné úrovni. Tato hloubka pozvolna roste s tím, jak do stromu přidáváme další data, nebo klesá spolu s vymazáváním dat ze stromu. Databázové systémy 1 - př. 8 11

12 Přístup pomocí adresy ROWID -ROWID jsou fyzickými adresami dat -obsahuje informaci o -Řádku vzhledem k souboru, -Bloku, -Řádku v bloku -Relativní číslo souboru -Hodnotu OBJECT_ID -adresa ROWID je nejrychlejší cestou k určitému řádku, k většímu množství řádků nebude však nejrychlejší metodou Databázové systémy 1 - př. 8 12

13 Indexy Vlastnosti: -zrychlení jen tehdy, pokud potřebujeme najít několik záznamů, pokud je cílem najít více než 5% záznamů, bude obvykle rychlejší hledání bez použití indexu, -zvýšení režie při vkládání a změně dat (INSERT, UPDATE, DELETE), protože kromě zápisu do tabulky je třeba zapsat indexový údaj na přesně definované místo v indexu, -nedoporučuje se používat indexy (kromě bitmapových indexů) nad tabulkami obsahujícími malé množství řádků (řádově desítky) nebo nad sloupci s nízkou variabilitou (např. sloupec pohlaví žena/muž), -odstraněním indexu zůstane tabulka nezměněná. Databázové systémy 1 - př. 8 13

14 Syntaxe příkazu CREATE INDEX Vytvoří index nad uvedeným sloupcem definované tabulky. CREATE [BITMAP] INDEX ON ( ) BITMAP vytvoří bitmapový index - vhodné řešení pro sloupce s nízkou variabilitou. Lze si to představit tak, že každé hodnotě ve sloupci odpovídá jeden bit kódu, tj. pro pohlaví jsou nutné 2 bity (muž, žena), pro rodinný stav 4 bity (svobodný, ženatý, rozvedený, vdovec). Příklad: CREATE INDEX ix_uc_prijmeni ON ucitele(prijmeni); CREATE INDEX ix_st_prijmeni_jmeno ON studenti (prijmeni, jmeno); CREATE BITMAP INDEX ix_pohlavi ON ucitele(pohlavi); Databázové systémy 1 - př. 8 14

15 Syntaxe příkazu DROP INDEX Odstraní index, ale nikoli data v tabulce. DROP INDEX Příklad: DROP INDEX ix_jmeno; Databázové systémy 1 - př. 8 15

16 INDEXY a principy přístupových cest Přístupové cesty jsou metodami, jejichž prostřednictvím může databáze získat data z tabulek. Přístupové cesty: -Přímý přístup pomocí adresy ROWID nebo algoritmu hash -Indexové přístupy (např. prohledávání indexu) -Úplné prohledávání (nutný průchod všemi řádky tabulky) Neexistuje jediná nejlepší cesta, kdyby existovala, používal by databázový systém jen tuto jedinou! Databázové systémy 1 - př. 8 16

17 Přístup pomocí adresy ROWID Typické použití pro přístup k tabulce po jejím prohledání pomocí některého typu indexu při použití dotazu typu: SELECT * FROM nazev_tabulky WHERE indexovany_sloupec = hodnota; Databáze provede tyto kroky: 1.Prohledá index u indexovaného sloupce 2.Načte hodnotu ROWID řádku, na který odkazuje 3.Podle hodnoty ROWID přistoupí k tabulce a načte konkrétní řádek 4.Kroky 2) a 3) opakuje, pokud více řádku splňuje danou podmínku (v případě, kdy indexovaný sloupec není unikátní) Použití tohoto přístupu lze i přímo z dotazu, pokud známe ROWID řádku, příklad: SELECT * FROM studenti WHERE ROWID='AAAVlyAAFAAAGQ3AAG' ; ROWID lze zjistit například příkazem : SELECT ROWID FROM studenti; Databázové systémy 1 - př. 8 17

18 Indexové prohledávání -Jde pravděpodobně o nejoblíbenější přístupovou metodu -Bloky na nejnižší úrovni stromu (listy) obsahují všechny indexované klíče a adresu ROWID, odkazující na konkrétní řádek -Vnitřní bloky (větví) slouží k navigaci strukturou indexu -Listové uzly indexu jsou ve skutečnosti dvojitě propojeným seznamem. Jakmile zjistíme, kde začít, je prohledání seřazených hodnot (prohledání rozsahů indexů) snadné (lze pokračovat v dalších listech, dokud nenarazíme na hodnotu vyšší než zadaná) -Všechny listové bloky by měly být na stejné úrovni stromu, -Většina indexů bude mít výšku 2 až 3, tj. pro vyhledání klíče bude třeba 2 nebo 3 vstupně-výstupních operací Databázové systémy 1 - př. 8 18

19 Indexové prohledávání Příklad struktury indexu B*Tree u číselného sloupce (s jedinečnými hodnotami nebo nad sloupcem, který je primárním klíčem), údaj ROWID bude obsahovat konkrétní adresu ROWID daného řádku. Databázové systémy 1 - př. 8 19

20 Prohledávání jedinečného indexu -Optimalizátor pozná, že indexované sloupce v indexu jsou jedinečné -Po prohledání indexu bude vrácen nejvýše jeden řádek pro jednu hodnotu v indexovaném sloupci -U nejedinečného indexu jsou data v indexu seřazena podle hodnot klíče indexu a poté podle hodnoty ROWID, pro jednu hodnotu z indexovaného sloupce může být tedy v listech indexové struktury několik odkazů (obsahujících ROWID) na různé řádky tabulky) Databázové systémy 1 - př. 8 20

21 Porovnání úplného prohledávání a přístupu pomocí indexu Horní část představuje průchod stromem indexu, spodní část přístup do tabulky a čtení konkrétního řádku. Databázové systémy 1 - př Pomocí indexuÚplné prohledávání

22 Prohledávání rozsahů indexu Rozsahy indexu mohou být prohledány jedním nebo dvěma směry (obvykle vzestupně, ale může být i sestupně) Příklad: SELECT cislo_zamestnance FROM zamestnanci WHERE cislo_zamestnance < 5000 ORDER by cislo_zamestnance DESC ; Databáze rozpozná, že se může vyhnout řazení, pokud index bude číst obráceně. Databázové systémy 1 - př. 8 22

23 Prohledávání rozsahů indexu Příklad: SELECT MAX(cislo_zamestnance) FROM zamestnanci Databáze rozpozná, že použije úplné prohledávání indexu, začte z opačného konce a zastaví se na první (nejvyšší) nalezené hodnotě. Databázové systémy 1 - př. 8 23

24 Bitmapové indexy Představme si tabulku učitelé: Nad níž vytvořme bitmapový index CREATE BITMAP INDEX ix_pohlavi ON ucitele(pohlavi); ROWIDPohlaví=‘M’Pohlaví=‘Ž’ … IdJmenoPrijmeniPohlavi 1JanaVeselᎠ2MartinaSmutnᎠ3SimonaChladnᎠ4KamilMalýM Databázové systémy 1 - př. 8 24

25 Indexy - shrnutí Indexy mohou být využity například v těchto případech: Očekáváme ve výsledku řádově menší počet řádků, než obsahuje tabulka, nad níž dotaz aplikujeme, přičemž daný dotaz omezuje rozsah hodnot v indexovaných sloupcích (s indexovanými sloupci se pracuje v klauzuli WHERE) Hledáme maximální či minimální hodnotu v indexovaném sloupci Chceme získat data jen z indexovaných sloupců (poté není nutné vůbec číst data z tabulky, stačí jen ze struktury indexu) Chceme řadit výsledky dle indexovaných sloupců (postupným průchodem listy B-stromu indexové struktury získáváme správné pořadí dat na výstupu) Skupinový dotaz v klauzuli GROUP BY pracuje s indexovanými sloupci (obdobně jako u klauzule ORDER BY je pro seskupení řádků ve stejné skupině pro optimalizátor vhodné, aby tyto seskupované řádky v rámci dané skupiny následovaly vždy postupně po sobě) O využití indexové struktury rozhoduje optimalizátor. Databázové systémy 1 - př. 8 25


Stáhnout ppt "Databázové systémy I Přednáška č. 8 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky"

Podobné prezentace


Reklamy Google