Tilfældigvis var jeg nødt til at gøre noget meget lignende for omkring 3 timer siden. Bordet var på 35 m rækker, det er ret bredt, og det tog en evighed at bare gøre dette:
alter table myTable add myNewColumn int not null default 0;
Her er hvad jeg endte med at gå med:
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;
Denne gang, alter table
udtalelser var næsten øjeblikkelige. Det tog omkring 7-8 minutter (på en langsom server) at lave opdateringsbatches. Jeg spekulerer i, at SQL Server genererede fortryd i min oprindelige forespørgsel for at gendanne værdierne, men jeg forventede ikke, at det startede.
Uanset hvad, i dit tilfælde ville noget lignende måske hjælpe. Du kan prøve at tilføje en ny bigint-kolonne, opdatere den nye kolonne i batches og derefter indstille begrænsningerne for den.