Está en la página 1de 3

En PL/SQL, todas las sentencias SELECT tienen el potencial de utilizar los datos

de rollback o undo (o datos de vuelta atrs). La base de datos Oracle a la hora de


procesar cualquier tipo de consulta utiliza los segmentos de rollback para producir
conjuntos de resultados de lectura consistente (la lectura consistente es una
caracterstica de las bases de datos Oracle que asegura que todos los registros dentro
de un conjunto de resultados, cuando son presentados a una aplicacin PLSQL o a
cualquier otro tipo de aplicacin, provengan de un mismo instante de tiempo).

No obstante, este uso de los segmentos de rollback no va a causar nunca por s solo
un error como el antes mencionado (ORA-01650 Unable to extend rollback segment... u
ORA-01651 Unable to extend undo segment...). Sin embargo, s que puede provocar un
error del tipo "ORA-01555 Snapshot too old".

Para que una sentencia SELECT pueda generar los errores ORA-01650 u ORA-
01651, es necesario que est generando segmentos de rollback y los motivos pueden
ser los siguientes:

La sentencia SELECT contiene la clusula FOR UPDATE.


La funcionalidad de auditora est habilitada.
La sentencia SELECT invoca a algn tipo de transaccin que escribe en la
base de datos Oracle.

Lo ms corriente es que la causa sea que la sentencia SELECT contenga una clusula
FOR UPDATE, cuando esto ocurre la base de datos Oracle bloquea todos los
registros necesarios antes de que la sentencia SELECT empiece a devolver
resultados, y bloquear un registro en la base de datos Oracle implica modificar un
bloque de la base de datos para registrar dicho bloqueo. Por otro lado, cada vez que
se modifica un bloque de la base de datos, se necesita generar un undo para esa
operacin.
Demostrar este hecho es muy sencillo. Creemos una sesin SQL y ejecutemos los
siguientes comandos sin que haya ningn otro usuario utilizando la base de datos:

SQL> SELECT used_ublk FROM v$transaction

No rows selected

SQL> BEGIN
2 FOR cursor IN (
3 SELECT * FROM nombre_tabla
4 FOR UPDATE)
5 LOOP null;
6 END LOOP;
7 END;
10 /

PL/SQL procedure successfully completed.

SQL> SELECT used_ublk FROM v$transaction

USED_UBLK
---------
932

SQL> COMMIT;

Segn queramos confirmar, podemos ver que la ejecucin de la sentencia SELECT


FOR UPDATE ha generado 932 bloques de undo (tened en cuenta que nombre_tabla
debe ser una tabla que exista en vuestra base de datos Oracle).
Cuando Oracle procesa las consultas se puede ver en la necesidad de utilizar espacio
en disco para poder llevar a cabo algunas partes del parsing (anlisis) y de la ejecucin
de la misma. Solamente utilizar este tipo de segmentos cuando no pueda realizar la
consulta ntegramente en memoria o cuando no pueda buscarse un mtodo
alternativo para realizarla utilizando los ndices.

Hay varios tipos de sentencias en las que Oracle se ve en la obligacin de utilizar los
segmentos temporales:

SELECT ... ORDER BY.


CREATE INDEX.
SELECT ... GROUP BY.
SELECT ... UNION ...
SELECT DISTINCT ...
SELECT INSERSEC ...
SELECT MINUS ...

Se puede dar el caso en el que algunas consultas en las que intervengan joins en los
que no haya ndices que faciliten la unin y en las que se den a la vez sentencias del
tipo "group by" y "order by" o incluso "distinct", en las que no solo se requiere de un
nuevo segmento temporal sino que pueden adquirirse dos segmentos para poder
realizar dichas consultas.

Como es natural, cuantas ms operaciones se hagan en memoria mejor ser el


rendimiento del sistema, por lo que si en nuestra aplicacin existe un nmero
considerable de consultas de las mencionadas anteriormente, resulta muy apropiado
hacer un tunning para decidir si ampliar la zona de memoria reservada para las
ordenaciones, aumentando el valor del parmetro SORT_AREA_SIZE.

En Oracle tambin existen las tablas temporales y los ndices temporales para dichas
tablas. Estos objetos tambin utilizan segmentos temporales, pero se les asigna y
desasigna de forma diferente a como se hace con las consultas, creacin de ndices y
ordenaciones.

También podría gustarte