Имах същия проблем, с изключение на това, че имам таблица с 2 милиарда реда, така че регистрационният файл няма да нарасне до безкрай, ако направя това, дори и с модела за възстановяване, зададен на Bulk-Logging:
insert into newtable select * from oldtable
Така че оперирам с блокове данни. По този начин, ако прехвърлянето е прекъснато, просто го рестартирате. Освен това не се нуждаете от регистрационен файл, голям колкото таблицата. Освен това изглежда получавате по-малко tempdb I/O, не знам защо.
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
Може да се наложи да промените начина, по който се справяте с идентификаторите, това работи най-добре, ако таблицата ви е групирана по ID.