2012-01-20 10 views
5

Una volta mi è stato detto che è più veloce eseguire un inserto e lasciare fallire l'inserto piuttosto che controllare se esiste una voce di database e quindi inserirla se manca.L'inserimento di una nuova voce del database è più veloce che controllare se la voce esiste prima?

Mi è stato anche detto che la maggior parte dei database è fortemente ottimizzata per la lettura della lettura piuttosto che per la scrittura, quindi un controllo rapido non dovrebbe essere più rapido di un inserto lento?

Questa è una domanda sul numero previsto di collisioni? (IE è più veloce da inserire solo se c'è una bassa probabilità che la voce sia già esistente.) Dipende dal tipo di database che sto utilizzando? E per questo, è una cattiva pratica avere un metodo che aggiungerà costantemente errori di inserimento nel mio log degli errori?

Grazie.

risposta

7

Se l'inserimento sta per fallire a causa di una violazione dell'indice, sarà al più marginalmente più lento di un controllo che il record esiste. (Entrambi richiedono di verificare se l'indice contiene il valore.) Se l'inserimento ha esito positivo, l'emissione di due query è molto più lenta di quella di emissione.

0

È possibile utilizzare INSERT IGNORE in modo che se la chiave esiste già, il comando di inserimento verrà semplicemente ignorato, altrimenti verrà inserita la nuova riga. In questo modo è necessario emettere una singola query, che verifica anche i valori duplicati e inserisce anche nuovi valori.
Stai ancora attento con INSERTO IGNORE poiché trasforma OGNI errore in un avviso. Leggi questo post per insert ignora
On duplicate key ignore?

0

Penso che INSERTO IGNORE INTO .... possa essere usato qui, o lo inserirà o lo ignorerà. Se si utilizza la parola chiave IGNORE, gli errori che si verificano durante l'esecuzione dell'istruzione INSERT vengono invece considerati come avvertimenti. Ad esempio, senza IGNORE, una riga che duplica un indice UNIQUE esistente o un valore PRIMARY KEY nella tabella causa un errore di chiave duplicata e l'istruzione viene interrotta. Con IGNORE, la riga non viene ancora inserita, ma non viene emesso alcun errore.

0

Se si desidera eliminare il vecchio valore e inserire un nuovo valore, è possibile utilizzare REPLACE È possibile utilizzare REPLACE invece di INSERT per sovrascrivere le vecchie righe.

REPLACE funziona esattamente come INSERT, tranne che se una vecchia riga della tabella ha lo stesso valore di una nuova riga per una chiave primaria o un indice univoco, la riga vecchia viene cancellata prima di inserire la nuova riga.

Altrimenti utilizzare INSERT IGNORE come verrà inserito o ignorato.

una riga che duplica un indice UNIQUE esistente o un valore PRIMARY KEY nella tabella provoca un errore di chiave duplicata e l'istruzione viene interrotta. Con IGNORE, la riga non viene ancora inserita, ma non viene emesso alcun errore.

0

Se la tua intenzione è di inserire se è un nuovo record O aggiorna il record se già esiste, allora che ne dici di fare un UPSERT?

Partenza - http://vadivel.blogspot.com/2011/09/upsert-insert-and-update-in-sql-server.html

Invece di verificare se esiste il record o non possiamo tentare di aggiornare direttamente. Se non ci sono record corrispondenti, @@ RowCount sarà 0. Sulla base di ciò possiamo inserirlo come nuovo record.[In SQL Server 2008 è possibile utilizzare il concetto MERGE per questo]

MODIFICA: Si noti che questo funziona per MS SQL Server e non conosco MySQL o ORACLE

Problemi correlati