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

Jak používat Explain Plan k optimalizaci dotazů?

Předpokládám také, že používáte Oracle. A také vám doporučuji, abyste se pro začátek podívali na webovou stránku vysvětlení plánu. Na optimalizaci je toho hodně, ale dá se to naučit.

Následuje několik tipů:

Za prvé, když vás někdo zadá optimalizaci, téměř vždy hledá spíše přijatelný výkon než maximální výkon. Pokud můžete zkrátit dobu zpracování dotazu ze 3 minut na 3 sekundy, nezkracujte ji na 2 sekundy, dokud o to nebudete požádáni.

Za druhé, proveďte rychlou kontrolu, abyste se ujistili, že dotazy, které optimalizujete, jsou logicky správné. Zní to absurdně, ale nemohu vám říci, kolikrát jsem byl požádán o radu ohledně pomalého dotazu, jen abych zjistil, že občas dává špatné odpovědi! A jak se ukázalo, ladění dotazu často také urychlilo.

V plánu vysvětlení hledejte zejména frázi „Kartézské spojení“. Pokud to tam vidíte, je strašně velká šance, že jste našli neúmyslné karteziánské spojení. Obvyklým vzorem pro neúmyslné kartézské spojení je, že klauzule FROM uvádí tabulky oddělené čárkou a podmínky spojení jsou v klauzuli WHERE. Až na to, že chybí jedna z podmínek spojení, takže Oracle nemá jinou možnost než provést kartézské spojení. U velkých tabulek je to výkonová katastrofa.

Je možné vidět Cartesian Join v plánu vysvětlení, kde je dotaz logicky správný, ale spojuji to se staršími verzemi Oracle.

Hledejte také nepoužitý složený index. Pokud není v dotazu použit první sloupec složeného indexu, Oracle může index používat neefektivně nebo vůbec. Uvedu příklad:

Dotaz byl:

select * from customers    
where
     State = @State
     and ZipCode = @ZipCode

(DBMS nebyl Oracle, takže syntaxe byla jiná a zapomněl jsem původní syntaxi).

Rychlé nahlédnutí do indexů odhalilo index na Customers se sloupci (Country, State, ZipCode) v tomto pořadí. Změnil jsem dotaz na read

  select * from customers
   where Country = @Country
      and State = @State
      and ZipCode = @ZipCode

a teď to běželo asi za 6 sekund místo asi 6 minut, protože optimalizátor dokázal index využít s velkou výhodou. Zeptal jsem se programátorů aplikací, proč vynechali zemi z kritérií, a toto byla jejich odpověď:věděli, že všechny adresy mají zemi rovnou 'USA', takže si mysleli, že by mohli urychlit dotaz tím, že by toto kritérium vynechali!

Optimalizace získávání databází bohužel není ve skutečnosti totéž, jako ubrat mikrosekundy z výpočetního času. Zahrnuje pochopení návrhu databáze, zejména indexů, a alespoň přehled o tom, jak optimalizátor dělá svou práci.

Obecně získáte lepší výsledky s optimalizátorem, když se s ním naučíte spolupracovat, místo abyste se jej snažili přechytračit.

Hodně štěstí při optimalizaci!



  1. Vytvořte jednu tabulku v mysql pouze pro čtení

  2. SQL Server:Jaký je rozdíl mezi CROSS JOIN a FULL OUTER JOIN?

  3. Jak upravím pole v novém datovém typu PostgreSQL JSON?

  4. Vložit při duplicitní aktualizaci v PostgreSQL?