Ci sono dei vantaggi in certi ordini di colonne quando si definiscono gli indici


13

Ad esempio, se ho due indici:

CREATE INDEX IDX_1 ON MY_TABLE_1
 (ITEM, DATE, LOCATION)
 COMPUTE STATISTICS;

CREATE INDEX IDX_2 ON MY_TABLE_1
 (DATE, LOCATION, ITEM)
 COMPUTE STATISTICS;

Ciò renderebbe IDX_2ridondante? In caso contrario, come posso determinare l'ordine di dichiarazione delle colonne?

Devo adattare gli indici alle query regolari?

Risposte:


12

Sì, il vantaggio arriva quando si desidera eseguire una query su una parte dell'indice. Se si inseriscono prima i predicati usati parzialmente, l'indice può essere utilizzato per le query che coinvolgono tali predicati ma non tutte le colonne dell'indice.

Inoltre, a meno che tu non abbia altri requisiti, può aiutare a mettere per primi i predicati più selettivi, in quanto ciò può ridurre le operazioni di ricerca dell'indice più velocemente.

Nel tuo caso IDX_2non è necessariamente ridondante a seconda della natura delle query sul tavolo. Tuttavia, potrebbe non essere necessario includere tutte le colonne. Se, ad esempio, fai molte query entro locatione datequindi IDX_2può essere utile per aiutarti a risolverle perché IDX_1non è nell'ordine giusto per essere utile per quello. Tuttavia, potresti scoprire che itemè ridondante IDX_2.

Da 9i, Oracle ha introdotto un operatore 'skip scan' in cui è possibile interrogare in modo più efficiente le colonne dell'indice finale, il che può ridurre la necessità di indici supplementari di questo tipo.

In un caso più specifico, se si esegue una query itemda locatione datenon sono necessarie altre colonne, è possibile risolvere completamente la query tramite l'indice senza dover leggere nulla dalla tabella. Puoi anche creare indici di copertura a cui sono collegate colonne non indicizzate. Se tutte le colonne necessarie possono essere risolte dall'indice di copertura, la query non deve assolutamente toccare la tabella principale.

Infine, in risposta alla tua ultima domanda: se disponi di una serie di query utilizzate regolarmente che utilizzano molte risorse e potrebbero essere ottimizzate utilizzando un indice, vale sicuramente la pena considerare. Tuttavia, la gestione degli indici comporta un sovraccarico sugli inserti, quindi sarà necessario scambiare le prestazioni delle query con il sovraccarico che gli indici collocano nelle operazioni di inserimento o aggiornamento.


3
@ConcernedOfTunbridgeWells: un approccio alternativo consiste nell'utilizzare la compressione della chiave di indice e avere le colonne meno selettive (meno valori distinti) in testa. Aiuta a portare a un indice più piccolo, consentendo comunque di saltare bene le scansioni.
Adam Musch,

2

Un'altra cosa da prendere in considerazione sono le colonne con molti valori nulli.

Se queste colonne hanno colonne specificate dopo di esse nell'indice, i valori null devono essere indicizzati. Altrimenti, come al solito, i valori null non vengono indicizzati (ovviamente, si presume che tu stia utilizzando un indice b-tree).

Quindi, se hai colonne con un gran numero di valori null, metterle alla fine dell'indice può farti risparmiare una notevole quantità di spazio su disco.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.