sql >> Databáze >  >> RDS >> Database

Příklad zlepšení výkonu dotazů pomocí indexů

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.


  1. Jak předat parametr sql do IN()?

  2. Zřetězení mnoha řádků do jednoho textového řetězce se seskupením

  3. Více SQL, méně kódu, s PostgreSQL

  4. Metadata týkající se typů záznamů na úrovni balíčků PL/SQL