Měl jsem stejný problém, až na to, že mám tabulku se 2 miliardami řádků, takže kdybych to udělal, soubor protokolu by se rozrostl do nekonečna, i když je model obnovy nastavený na hromadné protokolování:
insert into newtable select * from oldtable
Takže operuji s bloky dat. Tímto způsobem, pokud je přenos přerušen, stačí jej restartovat. Také nepotřebujete soubor protokolu tak velký jako tabulka. Také se zdá, že dostáváte méně tempdb I/O, nevím proč.
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
Možná budete muset změnit způsob zacházení s ID. To funguje nejlépe, pokud je tabulka seskupená podle ID.