Jag hade samma problem, förutom att jag har en tabell med 2 miljarder rader, så loggfilen skulle växa oändligt om jag gjorde detta, även med återställningsmodellen inställd på Bulk-logging:
insert into newtable select * from oldtable
Så jag opererar på datablock. På så sätt, om överföringen avbryts, startar du bara om den. Dessutom behöver du inte en loggfil så stor som tabellen. Du verkar också få mindre tempdb I/O, inte säker på varför.
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
Du kan behöva ändra hur du hanterar ID, detta fungerar bäst om din tabell är grupperad efter ID.