Ich hatte das gleiche Problem, außer dass ich eine Tabelle mit 2 Milliarden Zeilen habe, sodass die Protokolldatei ins Unendliche wachsen würde, selbst wenn das Wiederherstellungsmodell auf Massenprotokollierung eingestellt wäre:
insert into newtable select * from oldtable
Also arbeite ich mit Datenblöcken. Auf diese Weise starten Sie die Übertragung einfach neu, wenn sie unterbrochen wird. Außerdem benötigen Sie keine Protokolldatei, die so groß ist wie die Tabelle. Sie scheinen auch weniger tempdb I/O zu bekommen, nicht sicher warum.
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
Möglicherweise müssen Sie ändern, wie Sie mit IDs umgehen. Dies funktioniert am besten, wenn Ihre Tabelle nach ID geclustert ist.