Pregunta

En este momento el proceso que estamos usando para insertar conjuntos de registros es algo como esto:

(y tenga en cuenta que "el conjunto de registros" significa algo así como el historial de una persona, junto con sus direcciones, números de teléfono o cualquier otro tablas combinadas).

  1. Iniciar una transacción.
  2. Inserte un conjunto de registros que están relacionados.
  3. Commit si todo se ha realizado correctamente, hacer retroceder lo contrario.
  4. Ir de nuevo al paso 1 para el siguiente conjunto de registros.

¿Hay que estar haciendo algo más parecido a esto?

  1. Para comenzar una transacción al principio de la secuencia de comandos
  2. Iniciar un punto de guardado para cada conjunto de registros.
  3. Inserte un conjunto de registros relacionados.
  4. Rollo de vuelta al punto de rescate si hay un error, continúe si todo va bien.
  5. confirmar la transacción al principio de la secuencia de comandos.

Después de tener algunos problemas con ORA-01555 y leer algunos artículos Pregunte Tom (como éste ), estoy pensando en probar el segundo proceso. Por supuesto, como señala Tom, comenzando una nueva transacción es algo que debe ser definido por las necesidades del negocio. Es el segundo proceso vale la pena probar, o es una mala idea?

¿Fue útil?

Solución

Una transacción debe ser una unidad significativa de trabajo. Sin embargo, lo que constituye una unidad de trabajo depende del contexto. En un sistema OLTP una unidad de trabajo sería una sola persona, junto con su información de dirección, etc, pero que suena como si está implementando algún tipo de procesamiento por lotes, que está cargando un montón de personas.

Si usted está teniendo problemas con ORA-1555 es casi con toda seguridad, ya que son tienen una consulta de larga ejecución suministro de datos que se actualiza por otras transacciones. Cometer dentro de su bucle contribuye al uso cíclico de los segmentos de deshacer, por lo que tenderá a aumentar la probabilidad de que los segmentos que están confiando en proporcionar la consistencia de lectura se han reutilizado. Por lo tanto, no hacer que es probablemente una buena idea.

Si el uso de puntos de retorno es la solución es un asunto diferente. No estoy seguro de qué ventaja que le daría en su situación. A medida que se está trabajando con Oracle 10g quizás usted debe considerar el uso de mayor LMD registro de errores lugar.

Como alternativa es posible que desee volver a escribir la consulta de conducción para que funcione con trozos pequeños de datos. Sin saber más acerca de los detalles de su proceso que no puedo dar consejos específicos. Pero, en general, en lugar de abrir un cursor de 10000 registros que podría ser mejor para abrirlo veinte veces por 500 filas cada uno. La otra cosa a considerar es si el proceso de inserción puede ser más eficiente, por ejemplo mediante el uso de recolección a granel y FORALL.

Otros consejos

Algunas reflexiones ...

  1. Me parece que uno de los puntos de enlace de la asktom era el tamaño de su reversión / deshacer adecuadamente para evitar la década de 1555. ¿Hay alguna razón esto no es posible? Como él señala, es mucho más barato comprar el disco de lo que es escribir / mantener el código para manejar moverse por limitaciones de rollback (aunque tuve que hacer un doble-toma después de leer la etiqueta de precio $ 250 para una unidad de 36 GB - ese hilo se inició en 2002 ! Buena ilustración de la Ley de Moore!)
  2. Este enlace (Burleson) muestra una posible problema con puntos de retorno.
  3. ¿Es su transacción en la actualidad los pasos 2,3 y 5 en el segundo escenario? Si es así, eso es lo que haría - comprometo cada transacción. Suena un poco a mí como el escenario 1 es una colección de transacciones, todo en uno?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top