Saltar al contenido

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

Buscamos en diferentes foros para así tenerte la solución a tu duda, si continúas con alguna pregunta puedes dejarnos la pregunta y te responderemos con gusto, porque estamos para servirte.

Solución:

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.

Si está copiando en un nuevo tabla, la forma más rápida es probablemente lo que tiene en su pregunta, a no ser que tus filas son muy grandes.

Si sus filas son muy grandes, es posible que desee utilizar las funciones de inserción masiva en SQL Server. Creo que puedes llamarlos desde C#.

O puede descargar primero esos datos en un archivo de texto y luego copiarlos en masa (bcp). Esto tiene el beneficio adicional de permitirle ignorar keysíndices, etc.

Pruebe también la utilidad Importar/Exportar que viene con SQL Management Studio; No estoy seguro de si será tan rápido como una copia masiva directa, pero debería permitirle omitir el paso intermedio de escribir como un archivo plano y simplemente copiar directamente de tabla a tabla, lo que podría ser un poco más rápido que su SELECT INTO declaración.

He estado trabajando con nuestro DBA para copiar una tabla de auditoría con 240 millones de filas en otra base de datos.

El uso de una simple selección/inserción creó un enorme archivo tempdb.

El uso del asistente Importar/Exportar funcionó pero copió 8 millones de filas en 10 minutos

La creación de un paquete SSIS personalizado y el ajuste de la configuración copiaron 30 millones de filas en 10 minutos

El paquete SSIS resultó ser el más rápido y eficiente para nuestros propósitos.

Conde

Ten en cuenta compartir este ensayo si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *