Para resumir los detalles: necesitamos organizar aproximadamente 5 millones de filas en una base de datos de proveedor (Oracle). Todo funciona muy bien para lotes de 500k filas usando OracleBulkCopy
(ODP.NET), pero cuando tratamos de escalar hasta 5M, el rendimiento comienza a ralentizarse una vez que alcanza la marca de 1M, se vuelve progresivamente más lento a medida que se cargan más filas, y eventualmente tiempos de espera después de 3 horas más o menos.
Sospecho que está relacionado con una clave principal en la tabla, pero he estado pesca de arrastre de los foros de Oracle y desbordamiento de la pila de información y una gran cantidad de lo que estoy leyendo que contradice (también, una gran cantidad de mensajes parecen contradecir entre sí ) . Espero que alguien pueda dejar las cosas claras sobre algunas preguntas relacionadas con el proceso:
¿
OracleBulkCopy
Utiliza la clase carga convencional o directa? ¿Hay alguna forma de confirmar esto, de una forma u otra?Suponiendo que hace uso de vía directa de la carga: ¿Es cierto que Oracle establece automáticamente todos los índices a inutilizable durante la carga y los pone de nuevo en línea después? He leído varias declaraciones en este sentido, pero de nuevo, no puedo confirmarlo.
Si el n. ° 2 es verdadero, ¿debería hacer alguna diferencia qué índices hay en la tabla antes de iniciar una operación de copia masiva? Si es así, ¿por qué?
En relación con el n. ° 3, ¿hay alguna diferencia práctica, en general, entre la carga masiva con un índice inutilizable y la caída real del índice antes de la carga y volver a crearlo después?
Si el número 2 no es correcto, o si hay algunas advertencias que no entiendo, ¿haría alguna diferencia hacer explícitamente inutilizable el índice antes de la carga masiva y luego reconstruirlo explícitamente después?
¿Hay algo más, aparte de las compilaciones de índice, que pueda hacer que una operación de copia masiva disminuya progresivamente a medida que se agreguen más registros? (¿Tal vez algo relacionado con el registro, aunque esperaría que las operaciones masivas no se registren?)
Si realmente no hay otra forma de mejorar el rendimiento, además de descartar primero el PK / índice, ¿qué pasos puedo tomar para asegurarme de que el índice no desaparezca por completo, es decir, si la conexión a la base de datos se pierde en la mitad del proceso?