7

Tengo una aplicación azul en la nube con una base de datos sql azure. Tengo un rol de trabajador que necesita analizar + procesar en un archivo (hasta ~ 30 millones de filas) por lo que no puedo usar BCP o SSIS directamente.Inserción masiva paralela con SqlBulkCopy y Azure

Actualmente estoy usando SqlBulkCopy, sin embargo, esto parece demasiado lento ya que he visto tiempos de carga de hasta 4-5 minutos para 400k filas.

Quiero ejecutar mis inserciones en bloque en paralelo; sin embargo, al leer los artículos sobre importación de datos en paralelo/controlar el comportamiento de bloqueo, dice que SqlBulkCopy requiere que la tabla no tenga índices agrupados y que se debe especificar un bloqueo de tabla (bloqueo BU). Sin embargo, las tablas azules deben tener un índice agrupado ...

¿Es posible utilizar SqlBulkCopy en paralelo en la misma tabla en SQL Azure? Si no, ¿hay otra API (que pueda usar en el código) para hacer esto?

Respuesta

4

No veo cómo se puede ejecutar más rápido que con SqlBulkCopy. En nuestro proyecto podemos importar 250K filas en aproximadamente 3 minutos, por lo que su tasa parece correcta.

No creo que hacerlo en paralelo ayude, incluso si fuera técnicamente posible. Solo ejecutamos 1 importación a la vez; de lo contrario, SQL Azure comienza a agotar nuestras solicitudes.

De hecho, a veces, se ejecuta una consulta grupal por parte al mismo tiempo que la importación no es posible. SQL Azure hace un montón de trabajo para garantizar la calidad del servicio, esto incluye el tiempo de espera las solicitudes que tienen demasiado tiempo, toma demasiados recursos, etc.

Así que hacer varias inserciones masivas grandes al mismo tiempo se probablemente hacer que uno se acabó el tiempo.

+1

Ass Matt says. El rendimiento se siente bien para mí. Asegúrese de no tener índices en sus tablas aparte del índice agrupado. –

+4

Terminé insertando en tablas temporales en paralelo, y luego haciendo una inserción desde esas tablas temporales en las tablas principales (en serie). Eso me pareció mucho más rápido, ya que la inserción de las tablas temporales tomó ~ 4-5 minutos durante aproximadamente 2 millones de filas. – kyliod

1

Es posible ejecutar SQLBulkCopy en paralelo contra SQL Azure, incluso si carga la misma tabla. Debe preparar sus registros en lotes usted mismo antes de enviarlos a la API de SQLBulkCopy. Esto ayudará absolutamente con el rendimiento, y le permite controlar las operaciones de reintento para un lote más pequeño de registros cuando se lo estrangula por razones ajenas a su propia acción.

Eche un vistazo a mi blog post comparando los tiempos de carga de varios enfoques. También hay un código de muestra. En pruebas separadas, pude reducir el tiempo de carga de una tabla a la mitad.

Esta es la técnica que estoy usando para un par de herramientas (Enzo Backup; Enzo Data Copy); No es algo sencillo de hacer, pero cuando se realiza correctamente, puede optimizar los tiempos de carga significativamente.

Cuestiones relacionadas