lunes, 29 de noviembre de 2010

Temporary Tables y Redo Logs

Mucho se ha hablado al respecto y poco se ha entendido sobre las razones por la cuales las tablas temporales, sobre las cuales se ejecutan muchas transacciones DML, generan entradas en los Redo Logs.

El "misterio" esta en los segmentos de Undo, en la naturaleza o razón de ser de los Redo Logs y en el concepto mismo de las tablas Temporales.

La documentación de Oracle nos dice:

- Acerca de los Redo Logs:
"Las entradas de Redo Log registran datos que son usados para reconstruir todos los cambios hechos en la base de datos, incluyendo los segmentos de Undo. Por lo tanto, los redo logs tambien protegen los datos de Undo...".

- Acerca de las Temporary Tables:
"Las sentencias DML aplicadas a las tablas Temporales no generan entradas de Redo Log.Sin embargo, Las sentencias DML generan información de Undo, lo cual, la modificación a los segmentos de Undo si generan entradas sobre los Redo Log"...

Por tal motivo, aunque no se crean entradas de Redo Log para los cambios hechos en los bloques de las tablas Temporales, los cambios hechos sobre los bloques de los segmentos de Undo si generan entradas de Redo Log.
Lo anterior nos permite tener una mejora en el performance de la base de datos cuando tenemos muchas transacciones de tipo DML sobre las tablas Temporales por el nivel "menor" (menor <> nada) de entradas de Redo Log generadas que, obviamente, repercute en  menos I/O a nivel físico de la Base de Datos y, además,la creación de muchos Archive Redo Logs dependiendo de la configuración de nuestra Base de Datos.

Para muestra basta un botón:

SELECT tablespace_name, contents, logging
FROM dba_tablespaces
/

TABLESPACE_NAME                CONTENTS  LOGGING  
------------------------------ --------- ---------
SYSTEM                         PERMANENT LOGGING  
SYSAUX                         PERMANENT LOGGING  
UNDOTBS1                       UNDO      LOGGING  
TEMP                           TEMPORARY NOLOGGING
USERS                          PERMANENT LOGGING  

Indentifiquen el valor de la calumna LOGGING en aquellas filas en donde la columna  CONTENTS contiene el valor de UNDO. ¿Qué observamos? Interesante no!

La modificación a los segmentos de UNDO si generan entradas de Redo Log.

Ahora, pensemos en el siguiente escenario:

Hemos creado una tabla temporal en un tablespace en modo LOGGING y una de las columnas de la tabla es de algún tipo LOB. ¿La tabla temporal generará entradas de Redo Log? La respuesta es más que obvia. Si!. Pero tenemos un detalle aquí que es muy importante tomar en cuenta. Cuando especificamos una columna de tipo LOB en la creación de alguna tabla, Oracle crea automáticamente un lob segment y un lob index, los cuales, si no se especifica que deben estar en modo NOLOGGING o el tablespace que los contendrá esta en LOGGING como en nuestro caso, entonces, se generará más entradas de Redo Log que lo habitual por lo generado por los segmentos de UNDO.

1 comentario: