Кстати, мне пришлось сделать что-то очень похожее около 3 часов назад. Таблица была 35 м строк, она довольно широкая, и на это всегда приходилось делать это:
alter table myTable add myNewColumn int not null default 0;
Вот что я в итоге перешел с:
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;
На этот раз операторы alter table
были почти мгновенными. Для выполнения пакетов обновления потребовалось около 7-8 минут (на медленном сервере). Я предполагаю, что SQL Server генерирует отмену в моем исходном запросе для восстановления значений, но я не ожидал, что это начнется.
В любом случае, возможно, что-то подобное поможет. Вы можете попробовать добавить новый столбец bigint, обновить новый столбец партиями, а затем установить ограничения на него.