Zufällig musste ich vor ca. 3 Stunden etwas sehr ähnliches machen. Der Tisch hatte 35 Meter Reihen, er ist ziemlich breit, und es hat ewig gedauert, nur das zu tun:
alter table myTable add myNewColumn int not null default 0;
Hier ist, was ich am Ende gemacht habe:
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;
Diesmal die alter table
Aussagen waren fast sofort. Es dauerte ungefähr 7-8 Minuten (auf einem langsamen Server), um die Update-Batches durchzuführen. Ich spekuliere, dass SQL Server in meiner ursprünglichen Abfrage ein Undo generiert hat, um die Werte wiederherzustellen, aber ich habe nicht damit gerechnet, dass ich damit angefangen habe.
Wie auch immer, in Ihrem Fall würde vielleicht etwas Ähnliches helfen. Sie könnten versuchen, eine neue Bigint-Spalte hinzuzufügen, die neue Spalte in Stapeln zu aktualisieren und dann die Einschränkungen dafür festzulegen.