sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo copiar datos de una tabla enorme en otra tabla en SQL Server

Tuve el mismo problema, excepto que tengo una tabla con 2 mil millones de filas, por lo que el archivo de registro crecería sin parar si hiciera esto, incluso con el modelo de recuperación establecido en Bulk-Logging:

insert into newtable select * from oldtable

Así que opero en bloques de datos. De esta manera, si la transferencia se interrumpe, simplemente reiníciela. Además, no necesita un archivo de registro tan grande como la tabla. También parece obtener menos E/S de tempdb, no estoy seguro de por qué.

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

Es posible que deba cambiar la forma en que maneja las ID, esto funciona mejor si su tabla está agrupada por ID.