I den här artikeln ska vi titta på hur ett index kan förbättra frågeprestandan.
Introduktion
Index i Oracle och andra databaser är objekt som lagrar referenser till data i andra tabeller. De används för att förbättra frågeprestanda, oftast SELECT-satsen.
De är inte en "silverkula" - de löser inte alltid prestandaproblem med SELECT-satser. Men de kan säkert hjälpa.
Låt oss överväga detta i ett särskilt exempel.
Exempel
I det här exemplet kommer vi att använda en enda tabell som heter Kund som innehåller kolumner som ID, Förnamn, Efternamn, maximalt kreditvärde, skapat datumvärde och andra kolumner som vi inte kommer att använda.
SELECT customer_id,first_name,last_name, max_credit, created_date FROM customer;
Här är ett exempel på tabellen.
[tabell id=38 /]
Nu ska vi hitta följande:
- Vem av kunderna lades till i tabellen vid samma datum som de första kunderna
- Kunder filtrerade efter efternamn i stigande ordning
- Visa kund-ID, förnamn, efternamn, maxkredit och skapat datum
För att göra detta, skapa följande fråga:
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;
Utdatan ser ut så här:
[tabell id=39 /]
Den visar de data vi vill ha.
Prestanda innan index tillämpades
Låt oss nu titta på förklaringsplanen för den här frågan. Jag fick detta genom att köra EXPLAIN PLAN FOR för SELECT-satsen och följande kommando:
SELECT * FROM TABLE(dbms_xplan.display);
Du kan få ett liknande resultat med hjälp av Explain Plan-funktionen i din IDE också.
Vi kan se att den utför en Table Access Full vid två punkter, nämligen i underfrågan och i den yttre frågan. Detta beror på att det inte finns några index på tabellen som ska användas.
Den har en kostnad på 2934. När jag körde den hämtade frågan 785 rader på 1,9 sekunder. Det kan tyckas vara snabbt men det här är bara ett exempel som vi kan förbättra. Förfrågningar i riktiga system kan ta mycket längre tid.
Ett sätt vi kan förbättra prestandan för den här frågan är att lägga till ett index i kolumnen create_date. Denna kolumn används både i WHERE-satsen i den yttre frågan och i MIN-funktionen för den inre frågan.
Lägg till index
Vi kan lägga till ett index i den här tabellen för att förbättra frågeprestandan. Detta index kommer att lagras i kolumnen create_date så att koden kan se ut så här:
CREATE INDEX idx_cust_cdate ON customer (created_date);
Nu skapas indexet endast på denna kolumn. Det borde ge oss en prestandaförbättring i vår fråga, men vi måste kontrollera det först.
Vi har skapat ett b-trädindex, vilket förmodligen är allt vi behöver i den här kolumnen. Vi kommer att bekräfta det i förklaringsplanen inom kort. Jag har skrivit en guide om Oracle-index, inklusive hur man vet vilken indextyp som ska användas, samt massor av annan värdefull information.
Prestanda efter index tillagt
Låt oss köra om förklaringsplanen för den här frågan.
Vi kan se att ett index har använts i det sista steget. Det visar att en fullständig genomsökning har utförts med indexet idx_cust_cdate, vilket är det vi just har skapat.
Den visar också en total kostnad på 1472 och hämtar de 785 posterna på 0,9 sekunder.
Körtiden har bara förbättrats något (från 1,9 till 0,9 sekunder), men det är en förbättring på cirka 50 % bara genom att lägga till indexet i denna lilla datauppsättning.
Som nämnts tidigare kommer riktiga frågor att vara mer komplicerade än den här och det kommer att ta längre tid att exekveras. Men det här är ett exempel på hur ett index kan förbättra frågeplanen och frågekörtiden.