jueves, 14 de mayo de 2009

Truncate vs Delete

Abajo va un listado de las principales diferencias entre truncar y "deletear" todas las filas de una tabla. Por lo que me han contado gente conocida, parecería ser que enumerar las diferencias entre estas dos operaciones es una de las preguntas clásicas en los test de admisión de perfiles Oracle en las empresas.


1. TRUNCATE es una operacion DDL y es rapido y DELETE una operación DML y es lento.
2. TRUNCATE resetea el HWM y dealoca el espacio, DELETE no.
3. TRUNCATE no tiene vuelta atrás, ni siquiera se puede hacer un flashback. Es raro
que se pueda hacer flashback de un drop pero no de un truncate, no?. Con delete
se puede hacer un rollback y si ya se confirmo el borrado (commit) se podría
utilizar flashback.
4. TRUNCATE no dispara DML's triggers asociados a la tabla truncada.
5. TRUNCATE tiene un tratamiento especial para la MATERIALIZED VIEW LOG vinculada
con la tabla.
6. DELETE puede utilizarse para eliminar un subconjunto de datos, con TRUNCATE hay
que eliminar todas las filas. Sería bueno que existiera algo asi como: TRUNCATE
.. WHERE .., no?
7. TRUNCATE no puede mantener foreign keys, por el contrario con DELETE podemos
hacer delete cascade.
8. TRUNCATE invalida indices globales cuando se truncan particiones y
subparticiones. Por suerte desde 9i R2 se pueden mantener los indices globales
validos usando UPDATE GLOBAL INDEXES.
9. TRUNCATE puede validar indices que ya estaban invalidos y pasarlos a estado
valido. Cuidado cuando para acelerar procesos de carga se deshabiliten los
indices y luego se trunque, ya que la carga se hara con los indices habilitados.
Primero truncar y luego pasar los indices a unusables.
10.Ni TRUNCATE ni DELETE de todas las filas eliminan las estadísticas asociadas.
Sería interesante que se eliminen las estaditicas automaticamete con el TRUNCATE,
no?.
11.TRUNCATE invalida los cursores que referencian a la tabla en cuestión.
12.DELETE de tablas grandes genera una importante cantidad de UNDO y REDO.

Este listado no es definitivo, si alguien lee esta nota y gusta aumentar las lista con mas diferencias será bienvenido.

4 comentarios:

  1. Excelente información, jamas tuve que usar un truncate hasta ahora pero creo que seria lo mas rapido si quiero eliminar campos blob con algunos megas de informacion.

    FranKO

    ResponderEliminar
  2. Se dice aplicación, no aplicativo.

    ResponderEliminar
  3. Gracias por la información sobre truncate y delete.

    ResponderEliminar
  4. Muy bueno, Pablo...muy útil, era una duda, que siempre tuve pendiente de resolver...
    Abrazo!!

    ResponderEliminar