Domanda

Quando si lavora con tabelle di Oracle, come si fa a sapere quando si imposta un buon indice contro un cattivo indice?

È stato utile?

Soluzione

Questo dipende da cosa si intende per 'buono' e 'cattivo'.Fondamentalmente, è necessario rendersi conto che ogni indice si aggiunge l'incremento delle prestazioni per qualsiasi ricerca di colonna (in modo che l'aggiunta di un indice per il 'cognome' colonna di una persona tabella aumentare le prestazioni di query "where cognome =" in loro) ma diminuiscono le prestazioni di scrittura attraverso l'intera tabella.

La ragione di questo è quando si aggiunge o aggiorna una riga, è necessario aggiungere o aggiornare la tabella stessa e ogni indice di riga è un membro di.Quindi, se si dispone di cinque indici di una tabella, ogni aggiunta deve scrivere a sei posti di cinque indici e la tavola - e un aggiornamento possono essere a contatto fino a sei posti nel peggiore dei casi.

Indice la creazione è un atto di bilanciamento tra velocità di esecuzione delle query e la velocità di scrittura.In alcuni casi, come un datamart che viene caricato solo con i dati una volta alla settimana in una notte di lavoro, ma interrogato migliaia di volte al giorno, si fa un grande senso di sovraccarico con indici di velocità e le query tanto come possibile.In caso di transazione online sistemi di elaborazione, tuttavia, si desidera cercare e trovare un punto di equilibrio tra di loro.

Così, in breve, aggiungere gli indici di colonne che vengono utilizzati molto nella query di selezione, ma cercate di evitare di aggiungere troppi e quindi aggiungere più colonne utilizzate prima.

Dopo che la sua una questione di test di carico per vedere come le prestazioni reagisce in condizioni di produzione, e un sacco di tweaking per trovare un aceeptable equilibrio.

Altri suggerimenti

I campi sono diversi, altamente specifico, o unica rendere buoni gli indici.Come le date e gli orari, unica numeri progressivi (comunemente usato come chiavi primarie), persona di nomi, numeri di targa, ecc...

Un controesempio sarebbe di genere ci sono solo due valori comuni, in modo che l'indice non aiuta a ridurre il numero di righe che devono essere sottoposti a scansione.

Full-length descrittivi in forma libera stringhe poveri fare gli indici, come di chi sta eseguendo la query raramente conosce l'esatto valore della stringa.

Linearmente ordinato di dati (come timestamp o date) sono comunemente usati come un indice cluster, che costringe le righe per essere memorizzati in ordine di indice, e permette l'ordine di accesso, aumentando notevolmente la velocità di gamma query (ad es."dammi tutti gli ordini di vendita tra l'ottobre e il dicembre').In tal caso il DB engine può semplicemente cercare di primo record specificato dalla gamma e iniziare la lettura sequenziale fino a quando non incontra l'ultimo.

Ecco un ottimo SQL Server articolo:http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

Anche se la meccanica non funziona su Oracle, le punte sono molto a proposito (meno la cosa su indici cluster, non funzionano allo stesso modo in Oracle).

@Infame Mucca -- si deve pensare di chiavi primarie, indici non.

@Xenph Yan -- Qualcosa che gli altri non hanno toccato la scelta di ciò che è tipo dell'indice di creare.Alcuni database non davvero dare molta scelta, ma alcuni hanno una grande varietà di possibili indici.B-alberi sono la di default ma non sempre il miglior tipo di indice.Scegliere la giusta struttura dipende dal tipo di utilizzo che si aspettano di avere.Che tipo di query è necessario il supporto di più?Sono in una lettura più o scrivere-per lo più ambiente?Sono i tuoi scrive dominato dagli aggiornamenti o aggiunge?Etc, Etc.

Una descrizione dei diversi tipi di indici e i loro pro e contro è disponibile qui: http://20bits.com/2008/05/13/interview-questions-database-indexes/ .

Alcune regole del pollice, se si sta cercando di migliorare una determinata query.

Per una determinata tabella, dove si pensa che Oracle dovrebbe iniziare) tenta di indicizzazione di tutte le colonne utilizzate nella clausola WHERE.Mettere le colonne con l'uguaglianza per primo, seguito da colonne, con un intervallo o come.

Per esempio:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

Se le colonne sono di dimensioni molto grandi (ad es.conservare un po ' di XML o qualcosa del genere) si può essere meglio lasciare fuori l'indice.Questo renderà l'indice più piccolo per la scansione, supponendo che si deve andare alla riga della tabella per soddisfare l'elenco di selezione comunque.

In alternativa, se tutti i valori della SELECT e WHERE clausole presenti nell'indice di Oracle non è necessario per accedere alla riga di tabella.Quindi a volte è una buona idea mettere i valori selezionati ultimo dell'indice e di evitare una tabella di access, tutti insieme.

Si potrebbe scrivere un libro sui modi migliori per indice - ricerca per autore Jonathan Lewis.

Un buon indice è qualcosa che si può contare su di essere unici per uno specifico riga della tabella.

Quella più comunemente usata indice schema è l'uso di numeri che aumenta di 1 per ogni riga della tabella.Ogni riga avrà un diverso numero di indice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top