2011-07-01 15 views
5

Mi aplicación C# .NET escribe millones de registros en una tabla temporal utilizando OracleBulkCopy. Cada vez que la aplicación tiene 20000 registros o más en memoria, llama a OracleBulkCopy para escribirlos en un solo lote (estoy usando el tamaño de lote = 0). Al principio, la tabla está vacía y toma solo 2 segundos escribir todo el lote. Durante el proceso, el tiempo para escribir el lote aumenta. Después de 2.000.000 de registros, cada llamada dura casi 25 segundos. Estoy usando las opciones predeterminadas de OracleBulkCopy. Al hacer algunas pruebas cuando la tabla alcanza los 40.000.000, se necesitan casi 3 minutos para escribir 20.000 registros.OracleBulkCopy Performance

Me gustaría saber si hay alguna recomendación (no pude encontrar nada al respecto) para mantener un tiempo casi constante para cada llamada. ¿Estoy haciendo algo mal?

+0

¿Tiene algunos desencadenantes de inserción en esta tabla? – Nate

+1

No, nada. Ni siquiera una llave primaria. Y la tabla está configurada para ningún registro. –

+0

¿Qué significa exactamente la tabla "temp"? Una tabla temporal global? – DCookie

Respuesta

3

Parece un comportamiento extraño. ¿Ha rastreado la sesión de la base de datos haciendo las inserciones para ver qué está esperando?

ALTER SESSION SET timed_statistics=TRUE; 
ALTER SESSION SET max_dump_file_size=UNLIMITED; 
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 

99 veces de cada 100, los resultados del rastreo le señalarán el problema en estos raros casos de ralentización.

+1

El problema fue la clave principal. Estaba seguro de que la tabla fue creada sin una clave primaria. Usando el archivo de rastreo observamos miles de lecturas secuenciales en la clave principal. Al eliminarlo, se obtuvo un tiempo casi constante de 0,8 segundos por lote. –

+0

Me alegro de que lo haya encontrado y el rastro SQL encontró otro problema. Si las cosas van despacio, SQL Trace siempre debe ser lo primero que intente. –