Per coincidenza, ho dovuto fare qualcosa di molto simile circa 3 ore fa. La tabella era di 35 milioni di righe, è abbastanza ampia e ci voleva un'eternità per farlo:
alter table myTable add myNewColumn int not null default 0;
Ecco con cosa ho finito:
alter table myTable add myNewColumn int null;
while 1=1
begin
update top (100000) myTable
set
myNewColumn = 0
where
myNewColumn is null;
if @@ROWCOUNT = 0 break;
end
alter table myTable alter column myNewColumn int not null;
alter table myTable add constraint tw_def_myNewColumn default (0) for myNewColumn;
Questa volta, la alter table
le dichiarazioni sono state quasi istantanee. Ci sono voluti circa 7-8 minuti (su un server lento) per eseguire i batch di aggiornamento. Sto ipotizzando che SQL Server stia generando undo nella mia query originale per ripristinare i valori, ma non mi aspettavo che iniziasse.
Comunque, nel tuo caso, forse qualcosa di simile aiuterebbe. Potresti provare ad aggiungere una nuova colonna bigint, aggiornare la nuova colonna in batch, quindi impostare i vincoli su di essa.