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.