Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment copier une énorme table de données dans une autre table dans SQL Server

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.