Durante un progetto di migrazione, sono confrontato con un aggiornamento di 4 milioni di record nel nostro SQL Server.Aggiornamento di 4 milioni di record nel server SQL utilizzando l'elenco di ID record come input
L'aggiornamento è molto semplice; un campo booleano deve essere impostato su true/1 e l'input che ho è un elenco di tutti gli id per i quali questo campo deve essere compilato. (un id per riga)
Non sono esattamente un esperto quando arriva a compiti sql di queste dimensioni, quindi ho iniziato a provare 1 istruzione UPDATE contenente un "WHERE xxx IN ({list of ids, separated by comma})
". Innanzitutto, ho provato questo con un milione di record. Su un piccolo set di dati su un server di test, questo ha funzionato come un fascino, ma nell'ambiente di produzione questo ha dato un errore. Quindi, ho accorciato la lunghezza della lista di id un paio di volte, ma senza successo.
La prossima cosa che ho provato è stata di trasformare ogni id nella lista in un'istruzione UPDATE ("UPDATE yyy SET booleanfield = 1 WHERE id = '{id}'
"). Da qualche parte, ho letto che è bello avere un GO ogni x numero di linee, così ho inserito un GO ogni 100 righe (usando l'eccellente strumento 'sed', portato da unix).
Quindi, ho separato l'elenco di 4 milioni di istruzioni di aggiornamento in parti di 250.000 ciascuna, le ho salvate come file sql e ho iniziato a caricare ed eseguire il primo in SQL Server Management Studio (2008). Si noti che ho anche provato SQLCMD.exe, ma con mia sorpresa, questo ha funzionato circa 10-20 volte più lentamente di SQL Studio.
Ci sono voluti circa 1,5 ore per completare e il risultato è "Query completata con errori". L'elenco dei messaggi conteneva tuttavia una bella lista di "1 riga (e) interessata" e "0 righe (o) interessate", quest'ultima per quando l'id non era stata trovata.
Successivamente, ho controllato la quantità di record aggiornati nella tabella utilizzando un COUNT (*) e ho riscontrato una differenza di un paio di migliaia di record tra la quantità di istruzioni di aggiornamento e la quantità di record aggiornati.
Ho quindi pensato che ciò potesse essere dovuto ai record inesistenti, ma quando ho sottratto la quantità di "0 righe interessate" nell'output, c'era un misterioso divario di 895 record.
Le mie domande:
C'è un modo per scoprire una descrizione e la causa degli errori in "Query completate con errori".
Come si può spiegare il misterioso gap di 895 record?
Qual è un modo migliore o migliore per eseguire questo aggiornamento? (Come sto iniziando a pensare quello che sto facendo potrebbe essere molto inefficiente e/o soggetto a errori)
Gap sembra essere associato sia al fatto che si avevano id duplicati (che è certamente una possibilità con 4 milioni di record) o che l'id non esisteva bin il tavolo (un'altra possibilità). –
Come hai ottenuto quei record da 4 mil in una stringa csv? – Kaf
quanti record ci sono nella tabella totale? Sto pensando che se ci sono poco più di 4 milioni, potrebbe essere meglio eliminare la colonna, aggiungerla con un valore predefinito di 1 e aggiornare le altre righe a 0 o null. – UnhandledExcepSean