40
Databázové indexy Lubomír Andrle lubomir.andrle @ unicorn.eu 3. přednáška 14.10.2013

Databázové indexy

  • Upload
    tucker

  • View
    53

  • Download
    1

Embed Size (px)

DESCRIPTION

Databázové indexy. Lubom ír Andrle lubomir.andrle @ unicorn.eu 3 . přednáška 14 .10.201 3. Obsah. Co je index Struktura index u Jak se používá Časté chyby. Proč indexy. Slouží ke zrychlení vyhledávání dat Efektivní vynucování unique constraintů Z povahy jejich struktury - PowerPoint PPT Presentation

Citation preview

Page 1: Databázové indexy

Databázové indexy

Lubomír [email protected]

3. přednáška14.10.2013

Page 2: Databázové indexy

Obsah

> Co je index> Struktura indexu> Jak se používá> Časté chyby

Page 3: Databázové indexy

Proč indexy

• Slouží ke zrychlení vyhledávání dat• Efektivní vynucování unique constraintů– Z povahy jejich struktury

• Redukce I/O operací• Čtení dat bez přístupu do tabulky

Page 4: Databázové indexy

Vztah indexů s ostatními objekty

Page 5: Databázové indexy

Přehled schémat indexů

> B-tree index> B-tree cluster index> Hash cluster index> Reverse key index> Bitmap index> Bitmap join index

Page 6: Databázové indexy

Příklad přístupu do tabulky

Bez indexu• Full table scan

– Výhodné pokud je Davidů hodně

Index• Index (range) scan

– Nejdřív do indexu a až pak do tabulky

– Nemusí být výhodné, pokud je Davidů hodně

Everybody repeat after me: „Full table scans are not bad” ;)

Page 7: Databázové indexy

Struktura B-tree indexu• Root block• Branch block

– Klíč a pointer na první leaf block

• Leaf– Klíč a rowid – Pointer na předchozí a

následující leaf

Page 8: Databázové indexy

Vlastnosti indexu

• Balanced– Všechny leaf blocky jsou stejně daleko od rootu

• Setříděné záznamy– Zleva do prava

• Single-block ready– Multi-block ready jen ve spec. případě

Page 9: Databázové indexy

Statistiky indexu• B-level

– Výška indexu mezi root block a leaf– Definuje minimální počet „getů“ potřebných k projití indexu– Hloubka indexu = B-level + 1

• Leaf blocks– Average leaf blocks per key

• Průměrný počet leaf blocks potřebných projít v případě uložení hodnoty

– Average data blocks per key• Průměrný počet table blocks, která obsahují řádky referencované z klíče indexu

Page 10: Databázové indexy

Statistiky indexu II• Clustering factor (CF)

– Velmi silná statistika hýbající s cenou přístupu– Představuje jak dobře jsou setříděny řádky v tabulce vůči indexu– Statistika používaná CBO (Cost based optimizer) pro určení „ceny“ indexu– Problematický výpočet– Ne vždy odpovídá realitě

• Kde je hledat– user_indexes– v$index_stats

Page 11: Databázové indexy

Index s perfektním CF

Page 12: Databázové indexy

Index se slabým CF

Page 13: Databázové indexy

PRÁCE S INDEXY

Page 14: Databázové indexy

Metody přístupu do indexu> Metody

> Unique scan> Range scan> Full scan> Fast full scan> Skip scan> Min/max> Optimalizované joiny

> Přístupy do indexu jsou vždy single-block> db file sequential read> Výjimka Fast full scan

Page 15: Databázové indexy

Unique scan• Jeden z nejefektivnějších přístupů k datům• Použit v případě jedinečných hodnot indexu

– Primary key, Unique constraint• Vrací vždy maximálně jeden řádek

>=N

>=I>=E

A,C,.. F,H ,.. I,J ,K

>=V>=Q

N,P R,U V,Z

Tabulka

Page 16: Databázové indexy

Range scan

• Běžná operace pro přístup k výběru hodnot• Data vrácena setříděna – Defaultně vzestupně– Více řádků s identickými hodnotami seřazeny

podle ROWID

Page 17: Databázové indexy

Range scan - příklad• col1 = :b1• col1 < :b1; col1 > :b1• col1 like 'ASD%'• where col1 between 'J' and 'T'

>=N

>=I>=E

A,C ,.. F,H ,.. I,J ,K

>=V>=Q

N,P R,U V,Z

Tabulka

Page 18: Databázové indexy

Full scan

• Vlastně range scan bez omezení

>=N

>=I>=E

A,C,.. F,H ,.. I,J ,K

>=V>=Q

N,P R,U V,Z

Tabulka

Page 19: Databázové indexy

Skip scan - příklad

• Tabulka Employees – Sloupce id, pohlaví

• SELECT * FROM employees WHERE employee_id = 101;

Page 20: Databázové indexy

Min/max

• Hledá minimum nebo maximum na základě branches

>=N

>=I>=E

A,C,.. F,H ,.. I,J ,K

>=V>=Q

N,P R,U V,Z

Page 21: Databázové indexy

Fast full scan• Alternativa k full scan v případě, kdy všechny sloupce

dotazu jsou součástí indexu– Není nutný přístup do tabulky

• Multi-block read– Využití paralelního přístupu

• Ignoruje branch bloky a strukturu indexu vůbec

• Data nejsou řazena

>=N

>=I>=E

A,C,..

F,H,..

>=V>=Q

N,P

Page 22: Databázové indexy

Náročnost čtení indexu

> Jde vždy o LIO (logické I/O)> B-level + (leaf bloky * selektivita indexu) +

(clustering factor * selektivita tabulky)> Pravidlo 95/5

> „Na jeden klíč max. čtení 5% indexu“> CBO

> Pokud jsou statistiky přesné, spočítá to za vás

Page 23: Databázové indexy

Náročnost zápisu do indexu

> Typicky největší overhead při použití indexu> Zápis vždy při

> Insert> Delete> Update

> ( = insert + delete )

> Vlastní redo> Konkurence

Page 24: Databázové indexy

Split indexu

• 50/50 split při zaplnění leaf-blocku

Page 25: Databázové indexy

Split indexu II

• 90/10 split při zaplnění leaf-blocku– Speciální případ, pouze směrem doprava

Page 26: Databázové indexy

Split indexu - konkurence

> Během splitu se čeká …> Vlastní Redo> Propaguje se vždy směrem nahoru

> Always balanced> Root block – jediný se nikdy nemění

Page 27: Databázové indexy

SPECIÁLNÍ PŘÍPADY

Page 28: Databázové indexy

Složené indexy

> Index nad více sloupci tabulky> Zvýšení rychlosti v případech, kdy where

podmínka obsahuje všechny sloupce indexu> Záleží na pořadí sloupců!

Page 29: Databázové indexy

Function-based indexy

• Poskytuje efektivní mechanismus pro vyhodnocení příkazů, které obsahují funkci ve where podmínce

• Pozor na Null hodnotu– Není v indexu ukládána– Trik s decode

• Create index ix1 on tab1 (decode(status,'X',null))

• Příklad– CREATE INDEX idx ON table_1 (a + b * (c - 1), a, b);

Page 30: Databázové indexy

Reverse-key indexy

• Navrhnut k randomizaci indexovaných hodnot napříč strukturou indexu

• Typicky u front v RAC• Opatrně, může mít zásadní overhead• Randomizace v rámci celého indexu– Např. Při použití seq (1000) a „hot blocku“

Page 31: Databázové indexy

Partitioning indexes

• Lokální index

• Globální index– Nad celou tabulkou– Typicky použité

pro OLAP

Page 32: Databázové indexy

Bitmap index

• MARITAL_STATUS, GENDER mají nízkou kardinalitu

• Struktura indexu pro sloupec REGION

Page 33: Databázové indexy

Bitmap index

• Ukázka použití bitmap indexu

Page 34: Databázové indexy

ČASTÉ CHYBY

Page 35: Databázové indexy

Příliš mnoho indexů

> Velký overhead> AWR (Automatic Workload Repository)

> Prohledání plánů> Indexovat podle toho, co chceme hledat> Výjimkou jsou Foreign Keys

Page 36: Databázové indexy

Špatné pořadí sloupců

> Nekompatibilní predikáty> Optimizer pak musí použít špatnou metodu

přístupu> Where podmínka neodpovídá ani jednomu

indexu> Index (col1), index (col2)

> Where col1 = x and col2 = y> Měl by být složený ;)

Page 37: Databázové indexy

Použití OR kde není potřeba

• Ukázka– Výchozí hodnota sloupce Sl1 (not null)– Občas nutný override Sl2 (null)– Select … where Sl1 = ‘value’ or Sl2 = ‘value’

Page 38: Databázové indexy

Rebuild indexu> Téměř nikdy není potřeba

> Index se sám stále vyrovnává a čistí> Často velice drahý

> Konkurence> Redo> CPU

> Může zbytečně index rozmělnit> Je potřeba pokud

> Velké nárazové akce> Masivní delete, které ovlivní celý index> Fronty – typicky je všechno zajímavé úplně vpravo a index je zbytečně velký

Page 39: Databázové indexy

Špatné plány

> Zbytečné full scany indexů> CPU > Db file sequential read

> Zbytečné přístupy do tabulek> Špatné where podmínky

Page 40: Databázové indexy

Q&A