Eliminar todas las filas mediante TRUNCATE TABLE

La instrucción TRUNCATE TABLE es un método rápido y eficiente para eliminar todas las filas de una tabla. TRUNCATE TABLE es equivalente a la instrucción DELETE sin una cláusula WHERE. Sin embargo, TRUNCATE TABLE es más rápida y utiliza menos recursos de registro de sistema y de transacciones.

En comparación con la instrucción DELETE, TRUNCATE TABLE ofrece las siguientes ventajas:

  • Utiliza menos espacio de registro de transacciones.

    La instrucción DELETE quita una a una las filas y graba una entrada en el registro de transacciones por cada fila eliminada. TRUNCATE TABLE quita los datos al cancelar la asignación de las páginas de datos utilizadas para almacenar los datos de la tabla y sólo registra la página de asignaciones anuladas en el registro de transacciones.

  • Suele utilizar menos bloqueos.

    Cuando la instrucción DELETE se ejecuta mediante un bloqueo de fila, cada fila de la tabla se bloquea para su eliminación. TRUNCATE TABLE siempre bloquea la tabla y la página pero no cada fila.

  • Sin excepción, las páginas vacías permanecen en la tabla.

    Después de ejecutar una instrucción DELETE, la tabla todavía puede contener páginas vacías. Por ejemplo, las páginas vacías de un montón no se pueden desasignar sin por lo menos un bloqueo de tabla exclusivo (LCK_M_X). Si la operación de eliminación no utiliza un bloqueo de tabla, la tabla (montón) contendrá muchas páginas vacías. Para los índices, la operación de eliminación puede dejar páginas vacías, aunque éstas se desasignarán rápidamente por medio de un proceso de limpieza en segundo plano.

Como en el caso de DELETE, la definición de una tabla vaciada con TRUNCATE TABLE permanece en la base de datos, junto con sus índices y sus objetos asociados. Si la tabla contiene una columna de identidad, el contador para dicha columna se restablece al valor de inicialización definido para ella. Si no se define ningún valor de inicialización, se utiliza el valor predeterminado 1. Para conservar el contador de identidad, utilice DELETE.

Truncar tablas grandes

Microsoft SQL Server ofrecía la posibilidad de quitar o truncar las tablas con más de 128 extensiones sin mantener bloqueos simultáneos en todas las extensiones necesarias para la eliminación. Para obtener más información, vea Quitar y volver a generar objetos grandes.

Ejemplos

En el siguiente ejemplo se quitan todos los datos de la tabla JobCandidate. Las instrucciones SELECT se incluyen antes que la instrucción TRUNCATE TABLE para comparar los resultados.

USE AdventureWorks2008R2;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO