post icon

Delete o Truncate Table?

Muchos se preguntan constantemente que les conviene utilizar cuando quieren vaciar completamente una tabla, si uno es más rápido que el otro, cual es más óptimo?. Prácticamente todos los motores relacionales lo soportan.

Y si, cada uno tiene sus beneficios y contras, es cuestión de que es lo que buscamos lograr.

Para los que desconocen que hace el Truncate Table, es similar a ejecutar una sentencia Delete sin la claúsula Where


Las diferencias son:

  • Truncate elimina los datos por páginas, en cambio un delete lo hace registro por registro
  • Dado el punto anterior, significa que el truncate deja menor cantidad de registros en el log de transacciones, lo que hace que crezca menos la BD. Esto se debe agarrar con pinzas, ya que no pasa por el log, entonces no es posible recuperar sus datos a partir de un backup de Log.
  • Truncate se ejecuta más rápido al eliminar los registros en bloques.
  • Delete dispara los triggers habilitados de la tabla, en cambio Truncate no puede hacer.
  • Delete no borra las páginas creadas, simplemente las dejas vacías, en cambio el Truncate a la par que elimina los datos por páginas elimina sus páginas, simplemente dejando la página 0.
  • Si utilizamos alguna columna con identity (valor de identidad), Truncate lo reinicia a su valor por defecto o que haya sido seteado para inicio a diferencia del Delete que conserva el último valor.
  • Truncate bloquea toda la tabla, en cambio Delete bloquea todos los registros individualmente.

El permiso necesario para ejecutarlos en los motores suele ser poder ejecutar ALTER TABLE.

Algunos factores que se deben tener en cuenta para poder utilizar la sentencia TRUNCATE son las siguientes, si no cumple una de ellas obligatoriamente deben utilizar DELETE:

  • La tabla no debe tener valores con constraints del tipo FOREING KEY,  a no ser que sea una referencia a sí mismo (tabla recursiva).
  • Participar en una vista indizada (Para los motores que lo soportan)
  • No debe estar implicado en ningún sistema de replicación 1 0 2 way (para los motores que lo soportan).

Comentarios desde Facebook:

  1. avatar
    JC PARAGUAY Mozilla Firefox Windows
    4 agosto 2010 at 06:00 #

    … creo que no me parece valido compararlos de forma a que "podes hacer o una u otra"… cada una no tiene un pro y un contra en comparacion de la otra…

    Cada una puede ser utilizada en cierto momento.

    • avatar
      GeekZero PARAGUAY Google Chrome Windows
      4 agosto 2010 at 06:14 #

      Concuerdo contigo Juan en que ambos hacen cosas distintas, aunque sí similares y cada una se debe usar con un objetivo diferente. Es lo que intente transmitir, al exponerlos como diferencia supongo que evitarán usar el comando incorrecto para el contexto en que están, por ejemplo si sólo hacen backups de transaction log en SQL Server, no les es conveniente ejecutar un truncate por que no podrán recuperar esos datos más adelante si no hacen un BKP completo o incremental.

      La comparación lo hago por 2 motivos, la primera: en la documentación oficial de los motores lo explican o lo enseñan tambien con la comparativa. Y el segundo motivo es porque la gente busca así en los buscadores, por lo tanto llegan más usuarios a encontrar la info (este es un motivo un poco mbore, pero conveniente :P).

      • avatar
        JC PARAGUAY Mozilla Firefox Windows
        4 agosto 2010 at 06:17 #

        … che… como sabes que JC es Juan?… jaja… naaa Excelente el punto de vista… muy importante el "keyword"…

        • avatar
          GeekZero PARAGUAY Google Chrome Windows
          4 agosto 2010 at 06:25 #

          Simplemente probé suerte, Juan es el nombre más común hispanoamericano con J, si ponías JP ya nos imaginábamos el apellido 😛

          Supongo que hablas del keyword para las arañas, no? realmente desde que los utilice, noté la diferencia en la posición, principalmente en google..

        • avatar
          JC PARAGUAY Mozilla Firefox Windows
          4 agosto 2010 at 08:16 #

          asi mismo… muy importante para las arañitas…

    • avatar
      DIOCaraballo PARAGUAY Mozilla Firefox Windows
      4 agosto 2010 at 07:26 #

      Me parece que en el post dice claramente "vaciar completamente una tabla", por eso más bien hace la comparación.

      Si mal no me equivoco a ambas sentencias (TRUNCATE y DELETE) se le debe dar gran parte del credito para la elección del nombre de este sitio. 😈

      • avatar
        GeekZero PARAGUAY Google Chrome Windows
        4 agosto 2010 at 07:37 #

        @DioCaraballo, nadie lo hubiera podido decir mejor 💡

Responder