¿”TRUNCATE TABLE” en Teradata?

Una de las preguntas frecuentes de la gente que ha trabajado con Oracle y comienza con Teradata es si aquí existe también el comando “TRUNCATE TABLE”.
En Oracle, TRUNCATE TABLE es un comando que elimina todo el contenido de una tabla sin eliminar su estructura (como haría “DROP”) de una forma rápida y sin generar “UNDO” mediante la liberación de todos los “EXTENTS” con sus “DATABLOCKS” y vuelta de su HWM (High WaterMark) a ‘cero’. (Como todo ‘oraclero’ que se precie de serlo habrá notado, al hablar de HWM, EXTENTS y DATABLOCKS estamos abandonando el mundo de las TABLAS para adentrarnos en el submundo de los SEGMENTOS, y ahí habría tema para rato…)
Como todo en la vida, esto tiene un precio: TRUNCATE no es un comando DML (Data Modification Language), sino DDL (Data Definition Language) y como tal supone un COMMIT IMPLÍCITO y las consiguientes escrituras del “Log Writer” en el “Redo Log“. Además, está sujeto a restricciones en cuanto a existencias de ‘foreign keys‘, etc…

Pero volviendo al asunto: ¿existe “TRUNCATE TABLE” en Teradata? Pues la respuesta es que sí, sólo que en Teradata se llama “Fast Path DELETE” y no existe como comando diferenciado, sino como mecanismo interno que se ejecuta en determinados casos cuando hacemos un DELETE incondicional (unconstrained), esto es: sin cláusulas ‘WHERE’.

Aquí hay que extenderse un poco más en cómo Teradata gestiona las transacciones. En Teradata existe el mecanismo de “TRANSIENT JOURNAL”, que es análogo a lo que en Oracle se hace con el UNDO (Rollback Segments). Este transient journal almacena las imágenes ‘before’ de las filas modificadas para restaurarlas en el caso de que se necesite hacer un rollback de la transacción en curso. El espacio utilizado es el ‘PERMANENT’ de DBC y se libera automáticamente cuando la transacción termina (bien sea con COMMIT, bien sea con ROLLBACK). El problema es que este transient journal está muy lejos de ser óptimo. Esto es así porque Teradata fue pensado desde el principio como un sistema de Data Warehouse, no un OLTP. Y en un Data Warehouse las transacciones no deberían ser ni mucho menos tan frecuentes. De hecho, las herramientas de carga pensadas para dar un rendimiento máximo (fastload, multiload) lo evitan a base de tratar datablocks en vez de filas, saltándose así el SQL y por tanto el transient journal -por otra parte, hay que decir que eso es exactamente lo que hace Oracle con ciertos hints (/*+ APPEND */) que activan el Direct Path Loading para escribir en bloques nuevos evitando el UNDO-.

¿Y cómo se las arregla Teradata para que este proceso de borrado total sea lo más rápido posible? Pues con un atajo: el mecanismo de fast path delete no borra filas, sino que elimina los datablocks en los ‘cylinder indexes’ de forma análoga a lo que Oracle hace ‘reseteando’ el HWM de los segmentos. Esto hace que el borrado sea casi instantáneo (aunque irrecuperable).

Pero claro, para utilizar este mecanismo Teradata debe estar seguro de que se elimina cualquier posibilidad de que exista la necesidad ejecutar un rollback. Es por eso que como condición ‘sine qua non’ se necesita:

Si estamos en modo ANSI:

El DELETE incondicional debe ir seguido de un COMMIT como parte de un multistatement request:

...
DELETE FROM THE_TABLE ALL
;COMMIT;

Si estamos en modo Teradata hay dos posibilidades: que la transacción sea implícita o explícita.

En transacciones implícitas:

El DELETE incondicional debe ser el último (o único) statement de un request:

...
;DELETE FROM THE_TABLE ALL;

En transacciones explícitas:

El DELETE incondicional debe ir seguido de un END TRANSACTION como como parte de un multistatement request:

BEGIN TRANSACTION;
DELETE FROM THE_TABLE ALL
;END TRANSACTION;

Saludos.

Carlos.

Una respuesta a ¿”TRUNCATE TABLE” en Teradata?

  1. […] de INSERTS en particiones vacías en Teradata. También se ha hablado aquí de los “FAST PATH DELETES” en los borrados incondicionales sobre tablas. Pues bien, existe una optimización que […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: