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!