По стечение на обстоятелствата трябваше да направя нещо много подобно преди около 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 генерира undo в оригиналната ми заявка, за да възстанови стойностите, но не очаквах това да започне.
Както и да е, във вашия случай може би нещо подобно би помогнало. Можете да опитате да добавите нова колона bigint, да актуализирате новата колона на партиди, след което да зададете ограниченията върху нея.