Saya memiliki masalah yang sama, kecuali saya memiliki tabel dengan 2 miliar baris, sehingga file log akan terus bertambah jika saya melakukan ini, bahkan dengan model pemulihan yang disetel ke Logging Massal:
insert into newtable select * from oldtable
Jadi saya beroperasi pada blok data. Dengan cara ini, jika transfer terputus, Anda tinggal memulainya kembali. Juga, Anda tidak memerlukan file log sebesar tabel. Anda juga tampaknya mendapatkan lebih sedikit tempdb I/O, tidak yakin mengapa.
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
Anda mungkin perlu mengubah cara Anda menangani ID, ini berfungsi paling baik jika tabel Anda dikelompokkan berdasarkan ID.