J'ai eu le même problème, sauf que j'ai une table avec 2 milliards de lignes, donc le fichier journal augmenterait sans fin si je faisais cela, même avec le modèle de récupération défini sur Bulk-Logging :
insert into newtable select * from oldtable
J'opère donc sur des blocs de données. De cette façon, si le transfert est interrompu, il vous suffit de le redémarrer. De plus, vous n'avez pas besoin d'un fichier journal aussi gros que la table. Vous semblez également avoir moins d'E/S tempdb, vous ne savez pas pourquoi.
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
Vous devrez peut-être modifier la façon dont vous traitez les ID, cela fonctionne mieux si votre table est regroupée par ID.