Grimpi IT Blog

marzo 21, 2009

Diferencias entre TRUNCATE TABLE y DELETE FROM

Filed under: SQL Server, T-SQL — Etiquetas: , — grimpi @ 1:01 pm

Una duda bastante habitual entre los desarrolladores, es cuál es la diferencia entre un TRUNCATE TABLE y un DELETE FROM TABLE. Este post (y el blog en general) está centrado en SQL Server, sin embargo, la mayoría de las diferencias entre ambas sentencias aplican a cualquier motor de bases de datos (Oracle, MySQL, DB2, etc).
Primero voy a enumerar las diferencias y luego voy a explicar el porqué de dichas diferencias.

TRUNCATE TABLE

DELETE FROM

  • Es una operación DDL.
  • Es una operación DML.
  • No permite el borrado selectivo. TRUNCATE TABLE elimina todo el contenido de la tabla.
  • Permite el borrado selectivo, mediante la clausula WHERE.
  • No se puede ejecutar, si la tabla tiene asociadas, aun si no existiesen registros en la tabla que contiene la FK.
  • Se puede ejecutar si hay FK asociadas a la tabla, pero siempre y cuando no tenga registros asociados o la FK este deshabilitada.
  • Es la forma más rápida de eliminar el contenido de una tabla.
  • Es más lenta.
  • No se activa ningún trigger al ejecutarse (a partir de SQL Server 2005, es posible capturar el evento mediante un DDL trigger, pero a modo de auditoría, no es posible tener acceso a los valores que fueron eliminados).
  • Puede activarse el trigger de ON DELETE y poder determinar que registros están siendo eliminados. siendo eliminados.
  • En caso que la tabla tuviese un campo Identity, se resetea el valor a 1 (o al valor base determinado en el campo).
  • No resetea el valor del campo Identity, en caso que la tabla tuviese uno.
  • TRUNCATE TABLE desasocia (deallocate) las páginas de datos de la tabla.
  • DELETE FROM marca cada registro afectado, como eliminado.
  • El logueo en el transaction log es mínimo. Solo registra el dealloc de las páginas de datos.
  • Loguea cada operación sobre los registros afectados.
  • No puede ser ejecutado si la tabla tiene asociadas vistas indexadas.
  • Se puede ejecutar si la tabla tiene vistas indexadas.

Como podemos ver, TRUNCATE TABLE es bastante más restrictivo que DELETE, al punto que en muchas situaciones, aun si queremos eliminar todo el contenido de la tabla, no podemos hacerlo.

Ahora bien, que es lo que hace TRUNCATE y porque es mas rápido que su «competidor»?
Para eso primero voy a hacer una brevísima introducción a como almacena internamente SQL Server los datos.
En SQL Server, los registros de una tabla, son agrupados en una estructura física de datos, que se llama página. Cada página tiene un tamaño fijo de 8060 bytes, y puede almacenar uno o cientos de registros, dependiendo del tamaño del mismo. Cuando se intenta insertar más registros en una tabla y la página de datos está llena, se crea otra donde se inserta el nuevo registro y así sucesivamente.
El comando TRUNCATE, lo que hace es desasociar (deallocate) las páginas de datos de la tabla, sin alterar los registros en sí mismo, mientras que el DELETE FROM recorre cada uno de los registros y los marca como borrados, por lo tanto, hace muchas más operaciones de I/O, que aumenta exponencialmente en relación con TRUNCATE, a medida que aumenta el tamaño de la tabla.
Otra razón que explica la diferencia de performance, es que TRUNCATE TABLE solo loguea en el transaction log, el deallocate de las paginas con la tabla (por lo tanto, es posible hacer un rollback de un TRUNCATE, cosa que muchos piensan que no), mientras que el DELETE FROM manda al transaction log todos los registros afectados, lo que es obviamente mucho más costoso a nivel recursos de I/O.
Por último, al hacer un TRUNCATE un lockeo sobre la tabla, a diferencia del DELETE FROM que hace un lockeo por pagina o registro, el consumo de memoria para almacenar los objetos lockeados es mucho menor.

23 comentarios »

  1. GRACIAS POR EL DETALLE, ES MUY BUENO.

    Comentarios por Jaime Cueva — octubre 5, 2011 @ 5:10 pm

  2. Excelente! Gracias por tu valioso aporte

    Comentarios por nombre — diciembre 29, 2011 @ 3:26 pm

  3. Con TRUNCATE ya no poderemos recuperar los datos borados, en cabio el DELETE guarda un registro.

    Comentarios por Anónimo — febrero 10, 2012 @ 3:20 pm

  4. Reblogged this on dbasqlserver.

    Comentarios por ownerdba — May 22, 2012 @ 4:59 pm

  5. ni un brillo

    Comentarios por Anónimo — julio 11, 2012 @ 5:59 pm

  6. 11 main Differences between Delete and Truncate in sql server
    http://www.webcodeexpert.com/2013/03/difference-between-delete-and-truncate.html

    Comentarios por webcodeexpert — May 16, 2013 @ 11:05 am

  7. Muy bien explicado, tenía muchas dudas sobre este tema y lo aclaraste a la perfección.

    Comentarios por Anónimo — enero 3, 2014 @ 6:55 pm

  8. […] instrucciones, las que eh encontrado de forma muy resumida y entretenida en el siguiente link: https://grimpidev.wordpress.com/2009/03/21/diferencias-entre-truncate-table-y-delete-from/ del Blog […]

    Pingback por Diferencias entre TRUNCATE TABLE y DELETE FROM | German Cayo Morales — septiembre 22, 2014 @ 5:09 pm

  9. Lo mas importante es el logueo del delete, este puede llenar el log y causar que se reinicie en modo recuperacion la BD. Para evitarlo pueden usar delete top 1000000 while rowcount > 0 delete top 1000000 . Saludos.

    Comentarios por Luis Garcia — marzo 19, 2015 @ 4:12 pm

  10. wow me quede en las primeras… pero gracias por los detalles!

    Comentarios por Antonio Espinosa K F C — agosto 21, 2015 @ 6:43 pm

  11. Que pasara si al DELETE le quitan la condición WHERE?

    Comentarios por Anónimo — septiembre 24, 2015 @ 7:56 pm

    • ya no sabria que campo eliminar si fila o columna

      Comentarios por Anónimo — septiembre 13, 2016 @ 2:26 pm

    • pues al no tener ninguna condicion, borra todo el contenido de la tabla mientras en esta no exista integridad referencial

      Comentarios por Anónimo — May 1, 2017 @ 2:32 am

  12. Gracias por la explicación, muy instructiva. Sólo una duda, ¿por qué escribes «lockeo» en vez de «bloqueo»? ;)

    Comentarios por Javier — noviembre 26, 2015 @ 9:10 am

  13. Excelente muy bien explicado :) eres seco!!

    Comentarios por Anónimo — noviembre 26, 2015 @ 7:37 pm

  14. Teno un DELETE para borrar todos los registros de una tabla que se ha tardado mas de 2 horas… que pasaria si lo detengo para usar ustar una instruccion TRUNCATE TABLE???

    Comentarios por Fabian Gomez — abril 28, 2016 @ 9:02 pm

    • Sería casi instantáneo, pero no se puede hacer TRUNCATE si hay foreign keys

      Comentarios por Javier — abril 28, 2016 @ 10:08 pm

      • El tema que me tiene pensando es que si al parar la instrucción la base de datos se puede dañar…

        Comentarios por Fabian Gomez — abril 28, 2016 @ 10:13 pm

      • No sabría decirte, depende de qué base de datos estés usando. Yo diría que no tendría que dañarse, pero no me atrevo a mojarme.

        Comentarios por Javier — abril 29, 2016 @ 6:59 am

  15. Gracias por la explicación me ayudo mucho

    Comentarios por Anónimo — junio 5, 2016 @ 11:35 am

  16. Pero estas dos sentencias, no arrojan el mismo resultado? Es decir, más allá de la performance, borran todo el contenido de la tabla sin afectar la estructura… o el resultado final no es el mismo, a nivel datos¡?

    DELETE FROM copy_emp;

    TRUNCATE TABLE copy_emp;

    Comentarios por Ire Noek — septiembre 6, 2016 @ 6:48 pm

    • Sí, el resultado es el borrado de todos los registros, pero los detalles comentados hacen que sea propio usar una u otra sentencia dependiendo del caso.

      Comentarios por Javier — septiembre 6, 2016 @ 9:54 pm

  17. […] Pero es importante que conozcas las diferencias entre delete y truncate, aquí te comparto una tabla de las diferencias (Fuente:Diferencias entre delete y truncate) […]

    Pingback por Como borrar todos los registros de una tabla de SQLServer? - sql sql-server - Preguntas/Respuestas — diciembre 2, 2018 @ 7:56 pm


RSS feed for comments on this post. TrackBack URI

Deja un comentario

Blog de WordPress.com.