Przypadkowo musiałem zrobić coś bardzo podobnego jakieś 3 godziny temu. Stół miał 35 m rzędów, jest dość szeroki, a wykonanie tego zajęło wieczność:
alter table myTable add myNewColumn int not null default 0;
Oto, z czym skończyłem:
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;
Tym razem alter table
oświadczenia były niemal natychmiastowe. Wykonanie partii aktualizacji zajęło około 7-8 minut (na wolnym serwerze). Spekuluję, że SQL Server generował cofanie w moim pierwotnym zapytaniu, aby przywrócić wartości, ale nie spodziewałem się, że to zacznie się.
Zresztą w twoim przypadku może pomogłoby coś podobnego. Możesz spróbować dodać nową kolumnę bigint, zaktualizować nową kolumnę partiami, a następnie ustawić na niej ograniczenia.