2016-01-10 8 views
5

consideri this Oracle documenti su indici, this circa la velocità di inserimento e this domanda su StackOverflow mi portano a concludere che:Come e quando vengono utilizzati gli indici nelle operazioni INSERT e UPDATE?

  • indici ci aiuta a individuare le informazioni più rapidamente
  • chiavi primarie e unici sono indicizzati automaticamente
  • Inserimento con indici può causare prestazioni peggiori

Tuttavia, ogni volta che vengono discussi gli indici, ci sono solo SELECT operazioni mostrate come esempi.

La mia domanda è: sono indici utilizzati nelle operazioni INSERT e UPDATE? Quando e come?

miei suggerimenti sono:

  • UPDATE può usare indice in WHERE clausola (se la colonna nella clausola ha indice)
  • INSERT può usare indice quando utilizza SELECT (ma in questo caso, l'indice è da un altro tavolo)
  • o probabilmente al momento del check vincoli di integrità

ma non ho tale Knowle profonda dge of using indexes.

+2

rilevamenti vengono usati con operazioni INSERT e UPDATE se la tabella ha chiavi esterne o altri tipi di vincoli, unico per esempio. È anche possibile avere un famigerato evento di contesa TM se non si dispone di un indice su una chiave esterna.Oracle utilizza anche indici su tabelle dipendenti, non solo sulla tabella con cui si sta lavorando. Ci sono tonnellate di materiali in Internet e documentazione, quindi non penso che ci sia un punto di discussione qui. – stee1rat

+0

Fai attenzione, uno dei tuoi link (https://docs.oracle.com/cd/E17952_01/refman-5.1-en/insert-speed.html in particolare) è per mysql, non per Oracle. I documenti per entrambi i database si trovano su docs.oracle.com, è facile confonderli. – Timekiller

+0

Grazie per le vostre risposte. Sapevo che gli indici non sono usati solo sui tavoli con cui lavoro. Probabilmente mi aspettavo qualcosa di più difficile dietro. :) –

risposta

0

La dichiarazione di inserimento non ha alcun beneficio diretto per l'indice. Ma more index on a table cause slower insert operation. Pensa a una tabella che non ha indice e se vuoi aggiungere una riga, troverà un blocco di tabella che ha abbastanza spazio libero e memorizza quella riga. Ma se quella tabella ha indici su di esso, il database deve assicurarsi che anche queste nuove righe vengano trovate tramite gli indici. Quindi, per aggiungere nuove righe su una tabella che ha indici, è necessario anche inserire gli indici. Questo moltiplica l'operazione di inserimento. So more index you have, more time you need to insert new rows.

per update it depends on whether you update indexed column or not. Se non si aggiorna la colonna indicizzata, le prestazioni non dovrebbero essere influenzate. Index can also speed up a update statements if the where conditions can make use of indexes.

1

Per le istruzioni UPDATE, l'indice può essere utilizzato dall'ottimizzatore se ritiene che l'indice possa accelerarlo. L'indice verrebbe utilizzato per individuare le righe da aggiornare. L'indice è anche una tabella in un modo di parlare, quindi se la colonna indicizzata viene aggiornata, ovviamente ha bisogno di AGGIORNARE anche l'indice. D'altra parte se si sta eseguendo un aggiornamento senza una clausola WHERE, l'ottimizzatore può scegliere di non utilizzare un indice poiché deve accedere all'intera tabella, una scansione completa della tabella può essere più efficiente (ma potrebbe essere ancora necessario aggiornare l'indice). L'ottimizzatore prende tali decisioni in fase di esecuzione in base a diversi parametri, ad esempio se sono presenti statistiche valide rispetto alle tabelle e agli indici in questione, quanti dati sono interessati, quale tipo di hardware, ecc.

Per le istruzioni INSERT anche se l'INSERT stesso non ha bisogno dell'indice, l'indice dovrà anche essere 'inserito', quindi sarà necessario accedere a Oracle. Un altro caso in cui INSERTO può causare l'indice da utilizzare è un INSERTO simili:

INSERT INTO mytable (mycolmn) 
SELECT mycolumn + 10 FROM mytable;