Database
 sql >> Database >  >> RDS >> Database

Esempio di miglioramento delle prestazioni delle query con gli indici

In questo articolo, vedremo come un indice può migliorare le prestazioni della query.

Introduzione

Gli indici in Oracle e altri database sono oggetti che memorizzano riferimenti ai dati in altre tabelle. Vengono utilizzati per migliorare le prestazioni della query, il più delle volte l'istruzione SELECT.

Non sono un "proiettile d'argento":non risolvono sempre i problemi di prestazioni con le istruzioni SELECT. Tuttavia, possono certamente aiutare.

Consideriamo questo su un esempio particolare.

Esempio

Per questo esempio, utilizzeremo una singola tabella chiamata Cliente che contiene colonne come ID, Nome, Cognome, valore massimo del credito, valore della data creata e altre colonne che non utilizzeremo.

SELECT customer_id,first_name,last_name, max_credit, created_date
FROM customer;

Ecco un esempio della tabella.

[id tabella=38 /]

Ora troveremo quanto segue:

  • Chi dei clienti è stato aggiunto alla tabella nella stessa data con i primi clienti
  • Clienti filtrati per cognome in ordine crescente
  • Visualizza l'ID cliente, il nome, il cognome, il credito massimo e la data di creazione

Per fare ciò, crea la seguente query:

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;

L'output è simile a questo:

[id tabella=39 /]

Mostra i dati che desideriamo.

Rendimento prima dell'applicazione dell'indice

Ora, diamo un'occhiata al piano di spiegazione per questa query. L'ho ottenuto eseguendo EXPLAIN PLAN FOR per l'istruzione SELECT e il comando seguente:

SELECT * FROM TABLE(dbms_xplan.display);

Puoi ottenere un risultato di output simile anche utilizzando la funzione Spiega piano all'interno del tuo IDE.

Possiamo vedere che esegue un Table Access Full in due punti, vale a dire nella sottoquery e nella query esterna. Questo perché non ci sono indici sulla tabella da utilizzare.

Ha un costo di 2934. Quando l'ho eseguito, la query ha recuperato 785 righe in 1,9 secondi. Potrebbe sembrare veloce, ma questo è solo un esempio su cui possiamo migliorare. Le query nei sistemi reali possono richiedere molto più tempo.

Un modo per migliorare le prestazioni di questa query consiste nell'aggiungere un indice alla colonna data_creata. Questa colonna viene utilizzata sia nella clausola WHERE della query esterna che nella funzione MIN della query interna.

Aggiungi indice

Possiamo aggiungere un indice a questa tabella per migliorare le prestazioni della query. Questo indice verrà archiviato nella colonna data_creata in modo che il codice possa assomigliare a questo:

CREATE INDEX idx_cust_cdate
ON customer (created_date);

Ora, l'indice viene creato solo su questa colonna. Dovrebbe darci un miglioramento delle prestazioni nella nostra query, ma dovremo prima verificarlo.

Abbiamo creato un indice b-tree, che probabilmente è tutto ciò di cui abbiamo bisogno in questa colonna. Lo confermeremo a breve nel piano di spiegazione. Ho scritto una guida sugli indici Oracle, incluso come sapere quale tipo di indice utilizzare, oltre a molte altre informazioni preziose.

Rendimento dopo l'indice aggiunto

Eseguiamo nuovamente il piano di spiegazione su questa query.

Possiamo vedere che un indice è stato utilizzato nell'ultimo passaggio. Mostra che è stata eseguita una scansione completa con l'indice idx_cust_cdate, che è quello che abbiamo appena creato.

Mostra anche un costo complessivo di 1472 e recupera i 785 record in 0,9 secondi.

Il tempo di esecuzione è solo leggermente migliorato (da 1,9 a 0,9 secondi), ma si tratta di un miglioramento del 50% solo aggiungendo l'indice a questo piccolo set di dati.

Come accennato in precedenza, le query reali saranno più complicate di questa e richiederà più tempo per essere eseguite. Ma questo è un esempio di come un indice può migliorare il piano di query e il runtime della query.