Ik had hetzelfde probleem, behalve dat ik een tabel heb met 2 miljard rijen, dus het logbestand zou oneindig groeien als ik dit deed, zelfs als het herstelmodel was ingesteld op Bulk-Logging:
insert into newtable select * from oldtable
Dus ik opereer op datablokken. Op deze manier, als de overdracht wordt onderbroken, herstart je hem gewoon. U hebt ook geen logbestand nodig dat zo groot is als de tabel. Je lijkt ook minder tempdb I/O te krijgen, ik weet niet waarom.
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
Mogelijk moet u de manier waarop u met ID's omgaat, wijzigen, dit werkt het beste als uw tabel is geclusterd op ID.