Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come copiare i dati di una tabella enorme in un'altra tabella in SQL Server

Ho avuto lo stesso problema, tranne per il fatto che ho una tabella con 2 miliardi di righe, quindi il file di registro crescerebbe all'infinito se lo facessi, anche con il modello di ripristino impostato su Bulk-Logging:

insert into newtable select * from oldtable

Quindi opero su blocchi di dati. In questo modo, se il trasferimento viene interrotto, è sufficiente riavviarlo. Inoltre, non è necessario un file di registro grande quanto la tabella. Sembra che tu abbia anche meno I/O tempdb, non so perché.

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

Potrebbe essere necessario modificare il modo in cui gestisci gli ID, questo funziona meglio se la tua tabella è raggruppata per ID.