jueves 22 de marzo de 2007

Tablas temporales en las bases de datos Oracle

Además de las tablas de la base de datos permanentes, Oracle permite la creación de tablas temporales para mantener datos propios y exclusivos a una sesión Oracle determinada. Estos datos permanecerán en el sistema sólo durante el tiempo que dure la transacción o sesión involucrada. No obstante, al igual que para las tablas permanentes, la definición de las tablas temporales se almacena en las tablas del sistema.

La sentencia CREATE GLOBAL TEMPORARY TABLE crea una tabla temporal Oracle cuya temporalidad puede ser definida a nivel de transacción (los datos existen mientras se realiza la transacción) o a nivel de sesión (los datos existen mientras dura la sesión). Los datos en una tabla temporal son propios y privativos de la sesión Oracle que la está utilizando. Una sesión Oracle determinada puede ver y modificar los datos que durante dicha sesión se insertaron en la tabla temporal, pero estos datos no son accesibles desde otra sesión diferente. Como es lógico, la sentencia LOCK no tiene efecto sobre las tablas temporales ya que cada sesión hace uso de sus propios datos.

Así pues, los datos almacenados en una tabla temporal son visibles sólo para la sesión de Oracle que inserta datos dentro de dicha tabla. Para especificar si los datos de una tabla temporal son por sesión o por transacción, a la hora de crear la definición de la tabla, utilizaremos la cláusula ON COMMIT DELETE ROWS para indicar que la temporalidad es a nivel de transacción, o la cláusula ON COMMIT PRESERVE ROWS si queremos que la temporalidad sea a nivel de sesión.

A continuación podéis ver un ejemplo de comando SQL para crear una tabla temporal en Oracle:

CREATE GLOBAL TEMPORARY TABLE temp_listado 
(
nombre VARCHAR2(40),
fecha_nacimiento DATE
)
ON COMMIT PRESERVE ROWS

Asimismo, si ejecutamos una sentencia TRUNCATE sobre una tabla temporal, los datos que se truncarán serán los de la propia sesión desde la que se ejecuta la sentencia. Los datos que hayan podido ser insertados desde otras sesiones que estén utilizando la misma tabla, no se verán afectados por la sentencia TRUNCATE.

Los datos de una tabla temporal Oracle se borran automáticamente en el caso de que la sesión termine, bien porque el usuario desconecte, bien porque la sesión termine de una de manera anormal al producirse algún tipo de fallo.

Las tablas temporales admiten la creación de índices con el comando CREATE INDEX. Dichos índices, como las tablas, son también temporales, y los datos en el índice permanecen en el sistema mientras la tabla temporal existe.

También se pueden crear views y triggers sobre tablas temporales.

Asignación de segmentos

Para las tablas temporales, Oracle no asigna un segmento justo en el momento en que son creadas, cosa que si que hace para las tablas permanentes. Por contra, los segmentos son asignados cuando se realiza el primer INSERT.

Ser pueden ejecutar sentencias DDL (ALTER TABLE, DROP TABLE, CREATE INDEX,...) sobre las tablas temporales, pero sólo si no hay ninguna sesión que la esté utilizando en ese momento y que ya haya realizado un INSERT sobre la misma. La tabla temporal queda liberada en el momento en que la sesión termina, o cuando se ejecuta una sentencia COMMIT o ABORT si la temporalidad de la tabla fue definida a nivel de transacción.

De igual forma, los segmentos se liberan al final de la transacción o al final de la sesión según se haya definido la temporalidad de la tabla.

Artículos relacionados: Tablas externas en PLSQL.

6 comentarios:

flavin dijo...

esta buena la información pero falta más ejemplos, no tanto texto ... gracias de todas maneras

Julian Jaimes dijo...

Si nutres la informacion con ejemplos sera masa visitada tu pagina.

Pepelu dijo...

Ciertamente este artículo se merecía incluir algún ejemplo del comando a utilizar para crear una tabla temporal en una base de datos Oracle.

Para aquellos que lo habéis pedido, ya tenéis el correspondiente ejemplo.

kAlvaro dijo...

Entiendo entonces que una tabla temporal se maneja igual que una tabla normal y la única diferencia es que los datos son privados a tu sesión o transacción. No puedes generarla automáticamente a partir de una cláusula SELECT como en otros gestores de bases de datos sino que la defines con el resto de tablas de la aplicación.

Está bien, creo que las voy a usar :)

Christian dijo...

Ok en suma son una tablas fisicas que guarda datos por sesion o nivel de transaccion, se que son otras BD pero por ejemplo en sql server e informix si se usan verdaderas tablas temporales que solo existen mientras dura la sesion que las crea luego se dropean, se crean con "select .... insert into......" son rapidisimas por que estan en memoria, las de oracle son igual de rapidas ?, yo tengo una consulta(select) que demora mucho asi aplique join con indices, no use comodines etc, y quiero pasarla a un SP espero que se se redusca el tiempo de ejecucion.

Pepelu dijo...

Christian, no se trata de tablas físicas, lo único que se almacena es la definición de la tabla pero los datos almacenados son privativos de la sesión y desaparecen al terminar la misma. Lo datos se almacenan en memoria y son más rápidas que las tablas convencionales, no obstante no están enfocadas a manejar volúmenes de datos muy grandes.