Volcando millones de registros a Sql Server con Microsoft .Net - SQlBulkCopy
Estos días un cliente nos pidió desarrollar una interfaz entre él y un proveedor, el cual le enviaría todos sus artículos para el los pueda usar. La integración seria bajo archivos xml con mucha - pero mucha - información.
Bien, yo ya tenia listo el desarrollo y me toco probarlo y solicitamos que nos envíen datos de prueba, para sorpresa mía enviaron cerca de 2 millones de artículos en total, a lo cual yo dije esto debe ser una prueba de stress y que no ocurría en la realidad, pero lamentablemente era un caso real y esta carga se realizaría varias veces en el año.
Me dispongo a probar y para sorpresa mía el proceso se demoraría mas de 24 horas en procesar los 2MM de registros, donde el cuello de botella es principalmente la base de datos (según mis cálculos mas de 36), lo cual es realmente impresentable.
Después de la frustración de saber que lo que había desarrollado no servia para prácticamente nada, decidí implementar hilos y tareas con Parallel.ForEach lo cual redujo el tiempo considerablemente dejando el proceso total en 5 horas aproximadamente, pero por desgracia tampoco funciono, ya que no insertaba todos los registros que tenia que insertar, seguramente habían muchos hilos llamando a la base de datos y esta se bloqueaba, por lo que se registrarón solo 400 mil artículos.
Ya con el Dead-Line encima, comencé todo de cero y a investigar si existía una forma eficiente/rápida y que garantizara que los datos fueran escritos correctamente y llegue a la clase SqlBulkCopy, la cual es la forma mas eficiente de volcar los datos a una base de datos, después de implementarlo llegue al sorprendente tiempo de cargar los 2MM en menos de 15 minutos. Realmente sorprendente.
Notar que SqlBulkCopy trabaja con DataTables, Aquí les dejo el código
Gracias
ResponderEliminarAtte: Gignac
Puedes ver como se utiliza SqlBulkCopy en paralelo para copiar una base de datos en: https://www.inforcustom.duckdns.org/es-es/Documentacion/insertbulkbestia/ibbintroduccion
Eliminar