Non ho una risposta "migliore", ma ho una risposta "meno male" che potrebbe farti fare le cose ragionevolmente velocemente.
La mia tabella aveva righe 2MM e le prestazioni di aggiornamento erano ridotte quando ho provato ad aggiungere una colonna timestamp secondaria che era passata alla prima.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Dopo averlo sospeso per 40 minuti, l'ho provato su un piccolo lotto per farmi un'idea di quanto tempo ci sarebbe voluto: la previsione era di circa 8 ore.
La risposta accettata è decisamente migliore, ma questa tabella è ampiamente utilizzata nel mio database. Ci sono alcune decine di tabelle che FKEY su di esso; Volevo evitare di cambiare i TASTI ESTERI su così tanti tavoli. E poi ci sono viste.
Un po 'di ricerca di documenti, casi di studio e StackOverflow e ho avuto "A-Ha!" momento. Il drenaggio non era sul core UPDATE, ma su tutte le operazioni INDEX. La mia tabella aveva 12 indici: alcuni per vincoli univoci, alcuni per velocizzare il planner delle query e alcuni per la ricerca full-text.
Ogni riga AGGIORNATA non funzionava solo su DELETE / INSERT, ma anche sull'overhead di alterare ogni indice e controllare i vincoli.
La mia soluzione era eliminare ogni indice e vincolo, aggiornare la tabella, quindi aggiungere nuovamente tutti gli indici / vincoli.
La scrittura di una transazione SQL ha richiesto circa 3 minuti:
- INIZIO;
- indici / consegne rilasciati
- tabella di aggiornamento
- aggiungere nuovamente indici / vincoli
- COMMETTERE;
L'esecuzione dello script ha richiesto 7 minuti.
La risposta accettata è decisamente migliore e più corretta ... e praticamente elimina la necessità di tempi di inattività. Nel mio caso, però, ci sarebbe voluto molto più lavoro da "sviluppatore" per utilizzare quella soluzione e avevamo una finestra di 30 minuti di inattività programmata che poteva essere realizzata. La nostra soluzione ha risolto il problema in 10.
ALTER TABLE .. ADD COLUMN ...
o è necessario rispondere anche a quella parte?