Ho avuto lo stesso problema, tranne per il fatto che ho una tabella con 2 miliardi di righe, quindi il file di registro crescerebbe all'infinito se lo facessi, anche con il modello di ripristino impostato su Bulk-Logging:
insert into newtable select * from oldtable
Quindi opero su blocchi di dati. In questo modo, se il trasferimento viene interrotto, è sufficiente riavviarlo. Inoltre, non è necessario un file di registro grande quanto la tabella. Sembra che tu abbia anche meno I/O tempdb, non so perché.
set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = isNull(max(id),0) + 1
from newtable
select @LastID = max(ID)
from oldtable
while @StartID < @LastID
begin
set @EndID = @StartID + 1000000
insert into newtable (FIELDS,GO,HERE)
select FIELDS,GO,HERE from oldtable (NOLOCK)
where id BETWEEN @StartID AND @EndId
set @StartID = @EndID + 1
end
set identity_insert newtable off
go
Potrebbe essere necessario modificare il modo in cui gestisci gli ID, questo funziona meglio se la tua tabella è raggruppata per ID.