Tôi đã gặp vấn đề tương tự, ngoại trừ tôi có một bảng với 2 tỷ hàng, vì vậy tệp nhật ký sẽ phát triển không có kết thúc nếu tôi làm điều này, ngay cả với mô hình khôi phục được đặt thành Ghi nhật ký hàng loạt:
insert into newtable select * from oldtable
Vì vậy, tôi hoạt động trên các khối dữ liệu. Bằng cách này, nếu quá trình truyền bị xen kẽ, bạn chỉ cần khởi động lại nó. Ngoài ra, bạn không cần tệp nhật ký lớn như bảng. Bạn cũng có vẻ nhận được I / O tempdb ít hơn, không rõ tại sao.
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
Bạn có thể cần thay đổi cách xử lý ID, điều này hoạt động tốt nhất nếu bảng của bạn được nhóm theo ID.