同じ問題が発生しましたが、20億行のテーブルがあるため、これを実行すると、リカバリモデルがバルクロギングに設定されていても、ログファイルが無限に大きくなります。
insert into newtable select * from oldtable
だから私はデータのブロックを操作します。このように、転送が中断された場合は、再起動するだけです。また、テーブルほどの大きさのログファイルは必要ありません。また、tempdb I / Oが少なくなるようですが、理由はわかりません。
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
IDの処理方法を変更する必要がある場合があります。これは、テーブルがIDによってクラスター化されている場合に最適に機能します。