Necesito cargar un archivo CSV masivo (16GB, 65+ millones de registros) a una sola tabla en una base de datos de SQL Server 2005. ¿Alguien tiene alguna sugerencia sobre la mejor manera de hacer esto?Cargar un archivo CSV masivo a la base de datos de SQL Server
detalles
Actualmente estoy usando una aplicación de consola de C# (.NET framework 2.0) para dividir el archivo de importación en archivos de 50000 registros, a continuación, procesar cada archivo. Cargo los registros en la base de datos desde la aplicación de consola usando la clase SqlBulkCopy en lotes de 5000. Para dividir los archivos lleva aproximadamente 30 minutos, y para cargar todo el conjunto de datos (más de 65 millones de registros) toma aproximadamente 4.5 horas. El tamaño del archivo generado y el tamaño de carga por lotes son ambos ajustes de configuración, y estoy investigando para aumentar el valor de ambos para mejorar el rendimiento. Para ejecutar la aplicación, utilizamos un servidor de cuatro núcleos con 16 GB de RAM. Este servidor es también el servidor de la base de datos.
actualización
Dadas las respuestas hasta el momento, tenga en cuenta que antes de la importación:
- La tabla de base de datos está truncada, y todos los índices y las restricciones se eliminan.
- La base de datos se ha reducido y se ha reclamado espacio en el disco.
Después de la importación se ha completado:
- Los índices se vuelven a crear
Si puede sugerir enfoques diferentes, o cómo podemos mejorar la aplicación de importación existente, lo agradecería . Gracias.
pregunta relacionada
La siguiente pregunta puede ser de utilidad para otras personas que se ocupan de este problema:
Solución
He investigado la afecta la alteración del tamaño del lote, y el tamaño de los archivos divididos, y encontró que los lotes de 500 registros y los archivos divididos de 200,000 registros funcionan mejor para mi aplicación. El uso del SqlBulkCopyOptions.TableLock
también ayudó. Consulte la respuesta a este question para obtener más detalles.
También analicé el uso de un paquete SSIS DTS y un script SQL BULK INSERT
. El paquete SSIS apareció más rápido, pero no me ofreció la posibilidad de registrar registros inválidos, etc. El script SQL BULK INSERT
, aunque era más lento que el paquete SSIS, era considerablemente más rápido que la aplicación C#. Me permitió registrar errores, etc., y por esta razón, estoy aceptando la respuesta BULK INSERT
de ConcernedOfTunbridgeWells como la solución. Soy consciente de que esta puede no ser la mejor respuesta para todos los que enfrentan este problema, pero responde a mi problema inmediato.
Gracias a todos los que respondieron.
Saludos, MagicAndi
Eso es lo que hace la clase SqlBulkCopy. –
No es estrictamente cierto. SqlBulkCopy envuelve la API de carga masiva OLEDB que todavía está empujando los datos a través del enlace cliente-servidor. BULK INSERT se ejecuta en proceso en el servidor. – ConcernedOfTunbridgeWells
ConcernedOfTurnbridgeWells, gracias por la respuesta +1. Pruebo su solución y dejo algunos comentarios lo antes posible. – MagicAndi