2010-07-15 12 views
49

Podría alguien darme una visión general de los pros y los contras del uso de las dos afirmaciones siguientes:Pros y contras de TRUNCATE vs CANCELACIÓN de

TRUNCATE TABLE dbo.MyTable 

vs

DELETE FROM dbo.MyTable 

Parece que tanto haz lo mismo cuando todo esté dicho y hecho; pero debe haber diferencias entre los dos.

Respuesta

70

TRUNCATE no genera ningún dato de reversión, lo que hace que sea muy rápido. Simplemente desasigna las páginas de datos utilizadas por la tabla.

Sin embargo, si se encuentra en una transacción y desea la posibilidad de "deshacer" esta eliminación, debe usar DELETE FROM, que le permite deshacerse.

EDIT: Tenga en cuenta que lo anterior es incorrecto para SQL Server (pero se aplica a Oracle). En SQL Server, es posible deshacer una operación truncada si se encuentra dentro de una transacción y la transacción no se ha confirmado. Desde la perspectiva de SQL Server, una diferencia clave entre DELETE FROM y TRUNCATE es this: "La instrucción DELETE elimina las filas de una en una y registra una entrada en el registro de transacciones para cada fila eliminada. TRUNCATE TABLE elimina los datos desasignando los datos páginas utilizadas para almacenar los datos de la tabla y registra solo las desasignaciones de la página en el registro de transacciones ".

En otras palabras, hay menos registro durante un TRUNCATE porque solo las desasignaciones de página se registran en el registro de transacciones, mientras que con un BORRAR DE cada fila se graba el borrado. Esa es una de las razones por las que TRUNCATE es muy rápido.

Tenga en cuenta también desde ese enlace de MSDN que no puede truncar tablas a las que se hace referencia mediante restricciones de clave externa, participar en una vista indizada o publicar mediante la replicación transaccional o la duplicación de mezcla.

EDIT 2: Otro punto clave es que TRUNCATE TABLE se restablecerá su identidad a la semilla inicial, mientras que se CANCELACIÓN de continuar incrementando desde donde lo dejó. Referencia: respuesta de Ben Robinson.

+3

'TRUNCATE' también puede romper consistencia (= no comprueba las claves externas, y no se dispara disparadores) – nothrow

+13

@Yossarian - Según MSDN: "No puede usar TRUNCATE TABLE en una tabla a la que hace referencia una restricción FOREIGN KEY; en su lugar, use la instrucción DELETE sin una cláusula WHERE ". http://msdn.microsoft.com/en-us/library/aa260621%28SQL.80%29.aspx – dcp

+4

truncar también se puede retrotraer. http: // sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx – Dhananjay

-2

truncado doesnt hacer ningún registro, eliminar lo hace, así que si usted tiene un montón de registros, el registro de trans es enorme

4

TRUNCATE TABLE no registra la transacción. Eso significa que es muy rápido para mesas grandes. El inconveniente es que no puede deshacer la operación.

DELETE FROM registra cada fila que se está eliminando en los registros de transacciones, por lo que la operación lleva un tiempo y hace que los registros de transacciones crezcan de forma espectacular. Lo bueno es que puedes deshacer la operación si es necesario.

+2

TRUNCATE se registra y se puede deshacer como DELETE - utilizando ROLLBACK o RESTORE. – sqlvogel

+1

solo si usa transacciones, y si el truncamiento está comprometido, no se puede revertir. es DDL y no está registrado en el archivo de registro. – ScaleOvenStove

+1

Es interesante que tanto esta respuesta como la marcada como respuesta dicen casi lo mismo, pero esto se ha reducido a -1 mientras que la marcada como respuesta upvoted a +7 (al menos en este momento estoy escribiendo esto). Como @dcp anotó anteriormente, [esto] (http: //blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction-session-is-closed /) es un buen artículo que describe el comportamiento de retrotracción de TRUNCATE vs DELETE. –

43

Otro punto clave no se menciona en las otras respuestas es que se TRUNCATE TABLE restablecer su identidad a la semilla inicial, mientras que se DELETE FROM continuar incrementando desde donde lo dejó.

1

La diferencia fundamental está en la forma en que se registran. DELETE y TRUNCATE se registran de forma diferente, pero ambos se pueden revertir exactamente de la misma manera. Todas las operaciones que cambian los datos se registran.En SQL Server no existe tal cosa como una operación no registrada.

2

Creo que Eliminar y Truncar solo se puede revertir si la operación se ejecutó en una transacción explícita. De lo contrario, tendría que realizar una restauración para recuperar los datos eliminados

7

Otra diferencia desde el punto de vista de la seguridad es que TRUNCATE requiere privilegios ALTER en la tabla, mientras que DELETE simplemente requiere (tambor) DELETE permisos en esa tabla.

-1
$connection = $this->getEntityManager()->getConnection(); 
$connection->exec("Truncate TABLE <tablename>;"); 
+0

Podría por favor agregar algo de contexto a este código. – ppperry

0

Una cosa que es muy importante (OMI) y que no se mencionan en otras respuestas es que necesita TRUNCATE esquema de bloqueo de estabilidad, Sch-S, mientras que DELETE utiliza bloqueos de registro. Vamos a inspeccionar lo siguiente:

BEGIN TRANSACTION; 

BEGIN TRY 
    -- Truncate below will take LCK_M_SCH_S lock for TABLE_A 
    TRUNCATE TABLE TABLE_A 

    -- Lets say the query below takes 5 hours to execute 
    INSERT INTO 
     TABLE_A 
    SELECT 
     * 
    FROM 
     GIANT_TABLE (NOLOCK) 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
    THROW 
END CATCH 

IF @@TRANCOUNT > 0 
    COMMIT TRANSACTION; 

Ahora supongamos que después de 1-2 minutos siguientes al inicio de esta consulta, digamos que tratamos de ejecutar lo siguiente:

SELECT COUNT(*) FROM TABLE_A (NOLOCK) 

cuenta que he utilizado NOLOCK cláusula. ¿Qué crees que pasará ahora? Esta consulta esperará 5 horas. ¿Por qué? Porque la cláusula NOLOCK necesita el bloqueo Sch-S en TABLE_A pero esa cláusula TRUNCATE ya tiene Sch-S. Como todavía no hemos confirmado la transacción, el bloqueo sigue activo incluso después de esa cláusula TRUNCATE. Sch-S bloquear en una tabla básicamente significa que TABLE_A se está alterando mediante la adición/eliminación de columnas, etc. o está siendo truncado. Incluso no puede ejecutar algo como a continuación:

SELECT object_id('TABLE_A') 

Esto también se atascará durante 5 horas. Sin embargo, si reemplaza ese TRUNCATE con DELETE FROM, verá que no habrá un bloqueo Sch-S en la tabla y las consultas anteriores no se verán afectadas.

0

Otra diferencia entre DELETE vs TRUNCATE es el comportamiento cuando la tabla está dañada.

Por ejemplo:

DELETE FROM table_name; 

terminará con error:

Msg 3314, Level 21, State 3, Line 1

During undoing of a logged operation in database '...', an error occurred at log record ID(). Typically, the specific failure is logged previously as an error in the Windows Event Log service. Restore the database or file from a backup, or repair the database.

Msg 0, Level 20, State 0, Line 0

A severe error occurred on the current command. The results, if any, should be discarded.

Mientras TRUNCATE funcionará:

TRUNCATE TABLE table_name; 
-- Command(s) completed successfully. 
1

Esquema de Borrar Vs truncar en el servidor SQL

Para el artículo completo después de tomar esta conexión: Delete Vs Truncate in SQL Server

enter image description here

/*Truncate - Syntax*/ 
TRUNCATE TABLE table_name 

/*Delete - Syntax*/ 
DELETE FROM table_name 
WHERE some_condition 
Cuestiones relacionadas