sql >> Databáze >  >> RDS >> Oracle

Proč Oracle používá DBMS_STATS.GATHER_TABLE_STATS?

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.




  1. Jak funguje LOAD_FILE() v MariaDB

  2. Bring Your Own Cloud (BYOC) vs. Dedikovaný hosting na ScaleGrid

  3. Eliminace MySQL Split-Brain v multi-cloudových databázích

  4. Funkce DBTIMEZONE v Oracle