偶然にも、私は約3時間前に非常に似たようなことをしなければなりませんでした。テーブルは35mの列で、かなり幅が広く、これを行うのに永遠に時間がかかりました:
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列を追加し、新しい列をバッチで更新してから、制約を設定してみてください。