Coincidentemente, eu tive que fazer algo muito semelhante cerca de 3 horas atrás. A mesa tinha 35m de linhas, é bastante larga e estava demorando uma eternidade para fazer isso:
alter table myTable add myNewColumn int not null default 0;
Aqui está o que eu acabei indo com:
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;
Desta vez, a
alter table
declarações foram quase instantâneas. Demorou cerca de 7-8 minutos (em um servidor lento) para fazer os lotes de atualização. Estou especulando que o SQL Server estava gerando desfazer na minha consulta original para restaurar os valores, mas não esperava isso no início. De qualquer forma, no seu caso, talvez algo semelhante ajude. Você pode tentar adicionar uma nova coluna bigint, atualizar a nova coluna em lotes e definir as restrições nela.