Ho bisogno di aggiornare 100 milioni di record in una singola tabella, in effetti, normalizzando la tabella sostituendo il valore varchar di una colonna con semplicemente un ID. (Dico "sostituzione" ma in realtà sto scrivendo l'ID in un'altra colonna.)
Quello che sto cercando di ottenere è normalizzare il set di dati. I dati non ancora normalizzati non hanno indicizzazione. Il mio pensiero era che non avrei costruito indici sui valori grezzi, in attesa, invece di indicizzare le chiavi esterne che sostituiranno i valori varchar con valori tinyint dopo il completamento dell'aggiornamento.
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
sfondo
- utilizzando MSSQL 2008 R2 su Server 2008 R2
- il server ha 8 GB di RAM
- il server ha un RAID10, 7200 RPM SATA (non eccezionale, lo so, in produzione questo leggerà solo i dati e non li scriverà; inoltre la recente carenza di HD lo ha reso necessario per i costi)
- il server ha una doppia CPU Xeon quad-core
- la macchina non sta facendo altro (attualmente dedicato agli sviluppatori, solo questo processo)
- registrazione semplice attivata (? - ma registra comunque in modo da poter eseguire il rollback?)
- si noti che la query fa riferimento a due diversi DB, per quello che vale
- "larghezza" di un record nella tabella che viene aggiornata è 455 byte
Risorse durante l'esecuzione
- la RAM fisica è al massimo
- l'I / O del disco è al massimo
- La CPU non fa quasi nulla (il choke point è I / O)
- il tempo di esecuzione è stato di 14 ore e contando!
Sospetto alcune cose come se avessi bisogno di un indice sui dati grezzi, anche se lascerò cadere la colonna (AutoClassName) dopo gli aggiornamenti di normalizzazione. Mi chiedo anche se dovrei semplicemente buttare giù il tavolo un record alla volta anziché il JOIN, il che sembrava ridicolo al momento in cui ho iniziato questo, ma ora sembra che sarebbe stato più veloce.
Come dovrei cambiare più rapidamente la mia metodologia per i restanti aggiornamenti di normalizzazione (simili a questo)?
TOP
clausola. Questo sarebbe il mio approccio.