2010-10-09 12 views
5

Dati due scenari su SQL Server 2008/2005 - 1 Tabella ha 5 righe 2 Tabella ha 1 milione di righeÈ più veloce AGGIORNARE una riga, o CANCELLARLA e INSERIRE una nuova?

Se abbiamo bisogno di aggiornare alcune righe, ciò che è è efficiente e perché? 1) AGGIORNA le colonne richieste 2) ELIMINA la riga e INSERI nuova riga con le informazioni aggiornate

+0

Se è necessario aggiornare solo poche righe, non penso che le prestazioni contino tanto quanto se fosse necessario aggiornare tutte le 1 milione di righe. – BoltClock

+0

Ho aggiornato la domanda per menzionare che sto mirando idealmente a SQL 2005/2008. –

+0

Pensa a quello che stai chiedendo - sta facendo due operazioni più velocemente di una? Per eliminare un rec è necessario rimuoverlo dal datablock e dai blocchi di indice associati. Un inserto deve fare il contrario. Un aggiornamento è ottimizzato per l'aggiornamento sul posto proprio come è necessario, toccando solo gli indici se le colonne indicizzate cambiano. Quindi, in breve, l'aggiornamento è molto più veloce. – Will

risposta

17

Non dovrebbe essere questa domanda. Stai chiedendo "È meglio farlo nel modo giusto, o nel modo sbagliato, nel nome di un'idea nebulosa di 'più veloce'?"

Avete una domanda che è in qualche modo troppo lento? Per qualche ragione pensi che il problema sia dovuto al fatto che gli UPDATE impiegano troppo tempo? Hai effettuato misurazioni e benchmarking delle prestazioni delle interazioni del tuo database?

Quello che state facendo è l'ottimizzazione prematura della peggior specie, e si stanno facendo la vostra applicazione un disservizio in questo modo. Stai facendo ipotesi selvagge su come accelerare il tuo codice, con assolutamente nulla su cui basare.

scrivere il codice giusto. Quindi prova a trovare dove hai un problema di prestazioni. Hai mai avuto un problema di prestazioni, o stai facendo questa domanda semplicemente perché pensi che sia qualcosa che dovresti chiedere? Non dovresti.

Anche se specificamente avuto un problema con gli aggiornamenti di essere troppo lento, non siamo in grado di rispondere alla domanda di "è x più veloce di Y" perché non ci hai dato quasi abbastanza informazioni, come ad esempio:

  • Cosa database in uso
  • I layout di tabella
  • Quali sono gli indici sulla base di dati
  • Come stai interfacciarsi con il database

Scrivi il tuo codice correttamente, e poi tornare con specifiche su ciò che è troppo lento, piuttosto che indovinare micro-ottimizzazioni.

+4

Un po 'duro, ma così vero. – Damien

+1

Punti ben presi. Bene, questa domanda è stata una delle domande che mi sono state poste in un'intervista a un'azienda. Io stesso sono rimasto sorpreso da questa domanda inaspettata e ho dato loro il mio pensiero e le mie ragioni. Volevo condividere la domanda qui, nel caso in cui scopro nuove dimensioni che avrei potuto ignorare in precedenza. Grazie per il tempo dedicato a questa domanda. –

+0

Qual è il modo migliore di implementare la semantica: "Voglio che il database contenga esattamente un record con un PK di xxx e alcune colonne particolari come specificato, impostando le colonne rimanenti su valori particolari se non esiste alcun record, ma lasciandoli soli se uno fa "? Fai un inserto che potrebbe fallire (chiave duplicata) e fare un aggiornamento se l'inserimento fallisce, in qualche modo prova un inserto e aggiorna usando una transazione SQL, fai un SELECT per vedere se il record esiste, fai un insert se non (sperando che nessun altro batte me ad esso) e aggiornare altrimenti, o cosa? Supponiamo che il record esista il 99% delle volte. – supercat

1

In genere l'aggiornamento di una singola riga sarà più veloce. A causa dell'eliminazione della riga esistente e dell'inserimento di una nuova riga, entrambe queste operazioni avranno un impatto sull'indice cluster. L'aggiornamento di una singola riga avrà anche un impatto su vari indici ma non sull'indice cluster. Nessun punto dati per supportare il mio reclamo ma logicamente i motori DB dovrebbero comportarsi in questo modo.

Problemi correlati