V tomto článku se podíváme na to, jak může index zlepšit výkon dotazů.
Úvod
Indexy v Oracle a dalších databázích jsou objekty, které ukládají odkazy na data v jiných tabulkách. Používají se ke zlepšení výkonu dotazu, nejčastěji příkaz SELECT.
Nejsou „stříbrnou kulkou“ – ne vždy řeší problémy s výkonem pomocí příkazů SELECT. Rozhodně však mohou pomoci.
Zvažme to na konkrétním příkladu.
Příklad
V tomto příkladu použijeme jedinou tabulku s názvem Zákazník, která obsahuje sloupce jako ID, Jméno, Příjmení, maximální hodnota kreditu, hodnota data vytvoření a další sloupce, které nepoužijeme.
SELECT customer_id,first_name,last_name, max_credit, created_date FROM customer;
Zde je ukázka tabulky.
[id tabulky=38 /]
Nyní najdeme následující:
- Kdo z klientů byl přidán do tabulky ve stejný den jako první zákazníci
- Klienti filtrováni podle příjmení vzestupně
- Zobrazte číslo zákazníka, jméno, příjmení, maximální kredit a datum vytvoření
Chcete-li to provést, vytvořte následující dotaz:
SELECT customer_id, first_name, last_name, max_credit, created_date FROM customer WHERE created_date = ( SELECT MIN(created_date) FROM customer ) ORDER BY last_name;
Výstup vypadá takto:
[id tabulky=39 /]
Ukazuje data, která chceme.
Výkon před použitím indexu
Nyní se podívejme na plán vysvětlení pro tento dotaz. Získal jsem to spuštěním EXPLAIN PLAN FOR pro příkaz SELECT a následující příkaz:
SELECT * FROM TABLE(dbms_xplan.display);
Podobný výstupní výsledek můžete získat také pomocí funkce Explain Plan ve vašem IDE.
Vidíme, že provádí Table Access Full ve dvou bodech, a to v poddotazu a ve vnějším dotazu. Je to proto, že v tabulce nejsou žádné indexy, které by bylo možné použít.
Má cenu 2934. Když jsem to spustil, dotaz načetl 785 řádků za 1,9 sekundy. Mohlo by se zdát, že je to rychlé, ale toto je jen příklad, který můžeme zlepšit. Dotazy v reálných systémech mohou trvat mnohem déle.
Jedním ze způsobů, jak zlepšit výkon tohoto dotazu, je přidat index do sloupce created_date. Tento sloupec se používá jak v klauzuli WHERE vnějšího dotazu, tak ve funkci MIN vnitřního dotazu.
Přidat index
Do této tabulky můžeme přidat index, abychom zlepšili výkon dotazů. Tento index bude uložen ve sloupci created_date, takže kód může vypadat takto:
CREATE INDEX idx_cust_cdate ON customer (created_date);
Nyní je index vytvořen pouze na tomto sloupci. Mělo by nám to přinést zlepšení výkonu v našem dotazu, ale nejdřív to budeme muset zkontrolovat.
Vytvořili jsme index b-stromu, což je pravděpodobně vše, co v tomto sloupci potřebujeme. Brzy to potvrdíme v plánu vysvětlení. Napsal jsem průvodce o indexech Oracle včetně toho, jak zjistit, jaký typ indexu použít, a také spoustu dalších cenných informací.
Výkon po indexu Přidán
Spusťte znovu plán vysvětlení pro tento dotaz.
Vidíme, že v posledním kroku byl použit index. Ukazuje, že byla provedena úplná kontrola s indexem idx_cust_cdate, což je ten, který jsme právě vytvořili.
Také ukazuje celkovou cenu 1472 a načte 785 záznamů za 0,9 sekundy.
Doba běhu se zlepšila jen mírně (z 1,9 na 0,9 sekundy), ale to je asi 50% zlepšení pouhým přidáním indexu do této malé datové sady.
Jak již bylo zmíněno dříve, skutečné dotazy budou složitější než tento a jejich provedení bude trvat déle. Toto je však příklad toho, jak může index zlepšit plán dotazů a dobu běhu dotazu.