Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/07/2012, 20:53
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: ORA-01555: snapshot too old al usar BULK COLLECT en una tabla fija.

Cita:
¿Por qué un BULK COLLECT, que debería cargar simplemente un array en memoria, puede estar haciendo uso de los segmentos de rollback, especialmente considerando que es una tabla en la que sólo se hacen inserciones y no actualizaciones?
¿Qué relación hay entre BULK COLLECT y los segmentos de rollback?
El error ORA-01555 aparece cuando la consistencia del SELECT no se puede resolver porque los datos en los segmentos de rollback o de undo ya no están disponibles, y esto es independiente de que el resultado del SELECT lo almacenes en una variable, un array o una tabla, o de que el fetch sea de 1 registro o de 1 millón.

En cuanto al tipo de operaciones DML, los segmentos de undo guardan un registro con el dato anterior y el dato posterior, pero no tienen en cuenta si la modificación proviene de un delete, update o insert, lo que obliga siempre a leer los segmentos de undo para determinar si el dato anterior cumple con las condiciones del SELECT.

La solución varía en cada caso, mucho depende de los recursos que tengas, por ejemplo:

1. Si es posible, optimizar el proceso de depuración, el ORA-01555 no solo se produce por el volumen de registros, también se produce por la duración del SELECT, evalúa la posibilidad de pasar los registros a una tabla temporal con la sentencia insert into TempTable ... select * from LogTable en vez de procesar los registros dentro de un array.

2. Si tienes espacio en disco, agranda el tablespace de undo tanto como sea necesario, el undo_retention no ayuda mucho si el tablespace no puede almacenar como mínimo el volumen de registros del SELECT.

3. Si no tienes espacio en disco, divide el volumen de registros en múltiples SELECT que se ejecutan de forma serial, es decir, select ... where id <= 25, select ... where id between 25 and 50, etc (no es lo mismo que bulk collect limit 25), pero debes tener en cuenta que por las modificaciones sobre la tabla, el resultado de un SELECT puede ser diferente al resultado de múltiples SELECT.

4. Si no tienes espacio en disco y por la consistencia no puedes ejecutar múltiples SELECT, evalúa la posibilidad de lanzar el proceso de depuración en horarios con poca carga de transacciones.

Saludos