Dipende da un paio di cose.
In primo luogo, la distribuzione dei valori. Se hai solo cinque valori distinti, ma uno di questi rappresenta il 99,9999% delle righe nella tabella, ovviamente non vorresti che l'ottimizzatore usasse l'indice per quel valore ma tu potresti volerlo per gli altri. In alcuni casi come questo vale la pena utilizzare un indice basato sulle funzioni per assicurarsi di indicizzare solo i valori di interesse e non quelli che occupano spazio.
In secondo luogo, ci sono interrogazioni a cui è possibile rispondere utilizzando tale indice senza accedere alla tabella?
Si noti che non è solo la percentuale di righe a cui si accede che conta, ma il numero di blocchi della tabella a cui è necessario accedere. Ad esempio se hai una tabella di 1000 blocchi e 30 righe per blocco in media e una colonna ha 30 valori distinti (ognuno dei quali è presente in 1000 righe), quindi il numero di blocchi che devono essere visitati per leggere ogni riga per un singolo valore varia tra 1000/30 = 34 (vale la pena usare un indice) e 1000 (non vale la pena usare un indice) a seconda di come vengono distribuite le righe. questo è espresso dal fattore di clustering dell'indice - se il suo valore è vicino al numero di righe nella tabella, allora l'indice ha meno probabilità di essere usato, e se è vicino al numero di blocchi allora è più probabile che sia Usato.
Inoltre, si può osservare la compressione dell'indice per vedere se ciò consente di risparmiare spazio.
Fare attenzione agli indici bitmap: non sono amichevoli ai sistemi in cui sono soggetti a modifiche da più sessioni contemporaneamente (ad esempio due persone che inseriscono contemporaneamente nello stesso file righe nella tabella indicizzata).
Una strategia più efficace se si desidera migliorare l'efficienza delle query con i predicati su questi cinque valori è utilizzare il partizionamento, in parte a causa dell'eliminazione della partizione nella query ma anche a causa del miglioramento delle statistiche disponibili per l'ottimizzatore quando sa che sarà accessibile solo una partizione e potrà utilizzare statistiche a livello di partizione anziché statistiche globali.
fonte
2009-12-10 10:26:45
Dipende dalle vostre domande, ovviamente. L'esempio indica il caso in cui si sta filtrando secondo un criterio: 'FREQUENCYID'. Se prevedi di avere altri criteri in un secondo momento (magari usando una query dinamica) e filtri anche da loro, allora l'indice avrebbe più senso. –