una tabla servidores registros otra insertar diferentes datos copiar columna sql sql-server sql-server-2005 copying

servidores - insertar datos de una tabla a otra mysql



Cómo copiar una gran tabla de datos en otra tabla en SQL Server (7)

Tengo una tabla con 3,4 millones de filas. Quiero copiar todos estos datos en otra tabla.

Estoy realizando esta tarea usando la siguiente consulta:

select * into new_items from productDB.dbo.items

Necesito saber la mejor manera posible de hacer esta tarea.


seleccione * en new_items desde productDB.dbo.items

Eso es casi todo. Esta es la forma más eficiente de hacerlo.


Aquí hay otra forma de transferir mesas grandes. Acabo de transferir 105 millones de filas entre dos servidores utilizando esto. Muy rápido también.

  1. Haga clic derecho en la base de datos y elija Tareas / Exportar datos .
  2. Un asistente lo llevará a través de los pasos, pero al elegir su cliente de servidor SQL como fuente de datos y destino, le permitirá seleccionar la base de datos y las tablas que desea transferir.

Para obtener más información, consulte https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/


El trabajo simple Insertar / Seleccionar sp es excelente hasta que el número de filas supera 1 mil. He visto explotar el archivo tempdb intentando insertar / seleccionar más de 20 mil filas. La solución más simple es SSIS estableciendo el búfer de tamaño de fila de lote en 5000 y el tamaño de búfer de confirmación en 1000.


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

El uso de un simple seleccionar / insertar creó un enorme archivo tempdb.

El uso del asistente de importación / exportación funcionó pero copió filas de 8M en 10min

La creación de un paquete SSIS personalizado y el ajuste de la configuración copió filas de 30M en 10Min

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

Conde


Si está copiando en una nueva tabla, la forma más rápida es probablemente la que tiene en su pregunta, a menos que sus filas sean muy grandes.

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

O primero puede descargar esos datos en un archivo de texto, luego copiarlos en masa (bcp). Esto tiene la ventaja adicional de permitirle ignorar claves, índices, etc.

También intente 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 permitirte omitir el paso intermedio de escribir como un archivo plano, y simplemente copiar directamente tabla a tabla, lo que podría ser un poco más rápido que su SELECT INTO .


Si se trata de una importación de 1 vez, la utilidad de importación / exportación en SSMS probablemente funcionará de la manera más fácil y rápida. SSIS también parece funcionar mejor para importar grandes conjuntos de datos que un INSERT directo.

BULK INSERT o BCP también se pueden usar para importar grandes conjuntos de registros.

Otra opción sería eliminar temporalmente todos los índices y restricciones en la tabla que está importando y agregarlos nuevamente una vez que se complete el proceso de importación. Un INSERT directo que previamente falló podría funcionar en esos casos.

Si está lidiando con tiempos de espera o problemas de bloqueo / bloqueo cuando va directamente de una base de datos a otra, puede considerar pasar de una base de datos a TEMPDB y luego pasar de TEMPDB a la otra base de datos, ya que minimiza los efectos de bloquear y bloquear procesos en cualquier lado. TempDB no bloqueará ni bloqueará la fuente y no retendrá el destino.

Esas son algunas opciones para probar.

-Eric Isaacs


Tuve el mismo problema, excepto que tengo una tabla con 2 mil millones de filas, por lo que el archivo de registro crecería hasta el final si lo hiciera, incluso con el modelo de recuperación establecido en Registro masivo:

insert into newtable select * from oldtable

Así que opero bloques de datos. De esta manera, si la transferencia se interrumpe, simplemente reinicie. Además, no necesita un archivo de registro tan grande como la tabla. También parece que tienes menos I / O de tempdb, no estás 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 los identificadores, esto funciona mejor si su tabla está agrupada por identificador.