Většina podnikových databází, včetně Oracle, používá k určení vhodného plánu dotazů pro daný příkaz SQL optimalizátor založený na nákladech. To znamená, že optimalizátor používá informace o datech k určení, jak provést dotaz, spíše než se spoléhat na pravidla (takto to dělal starší optimalizátor založený na pravidlech).
Představte si například tabulku pro jednoduchou aplikaci pro sledování chyb
CREATE TABLE issues (
issue_id number primary key,
issue_text clob,
issue_status varchar2(10)
);
CREATE INDEX idx_issue_status
ON issues( issue_status );
Pokud jsem velká společnost, mohl bych mít v této tabulce 1 milion řádků. 100 z nich má issue_status
z ACTIVE, 10 000 má issue_status
z QUEUED a 989 900 má stav COMPLETE. Pokud chci spustit dotaz proti tabulce, abych našel své aktivní problémy
SELECT *
FROM issues
WHERE issue_status = 'ACTIVE'
optimalizátor má na výběr. Může buď použít index na issue_status
a poté proveďte jednořádkové vyhledávání v tabulce pro každý řádek v indexu, který se shoduje, nebo může provést prohledání tabulky issues
stůl. Který plán je efektivnější, bude záviset na datech, která jsou v tabulce. Pokud Oracle očekává, že dotaz vrátí malou část dat v tabulce, použití indexu by bylo efektivnější. Pokud Oracle očekává, že dotaz vrátí podstatnou část dat v tabulce, bude skenování tabulky efektivnější.
DBMS_STATS.GATHER_TABLE_STATS
je to, co shromažďuje statistiky, které společnosti Oracle umožňují toto určení. Říká společnosti Oracle, že v tabulce je zhruba 1 milion řádků, že existují 3 různé hodnoty pro issue_status
a že data jsou rozložena nerovnoměrně. Oracle tedy ví, že má pro dotaz použít index k nalezení všech aktivních problémů. Ale také to ví, když se otočíte a pokusíte se hledat všechny uzavřené záležitosti
SELECT *
FROM issues
WHERE issue_status = 'CLOSED'
že bude efektivnější provést sken tabulky.
Shromažďování statistik umožňuje, aby se plány dotazů v průběhu času měnily podle toho, jak se mění objemy dat a distribuce dat. Když poprvé nainstalujete nástroj pro sledování problémů, budete mít jen velmi málo VYPLNĚNÝCH problémů a více problémů AKTIVNÍCH a VE FRONTĚ. Postupem času se počet Dokončených čísel zvyšuje mnohem rychleji. Jak získáte více řádků v tabulce a změní se relativní zlomek těchto řádků, které jsou v různých stavech, změní se plány dotazů, takže v ideálním světě vždy získáte ten nejefektivnější možný plán.