Ir al contenido principal

DELETE VS TRUNCATE

El comando TRUNCATE, lo que hace es desasociar las páginas de datos de la tabla, sin alterar los registros en sí mismo, mientras que el DELETE 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.


Cuando trabajamos con tablas que tienen millones de registros nos preguntamos si debemos utilizar DELETE o TRUNCATE, ¿cuál es más óptimo? referente al rendimiento de nuestro servidor, ¿es posible revertir la operación si comenzamos una transacción?, descubramos en el siguiente caso:
Caso práctico
En primer lugar crearemos una tabla e insertamos datos de prueba.
-- Creamos la tabla
CREATE TABLE Employee(
       Empid int NOT NULL,
       Name nchar(10) NULL,
       City nchar(10) NULL
) ON [PRIMARY]
GO
-- Insertamos algunos datos
insert into Employee values (1,'Shweta','Pune') ,(2,'Stella','Hydrabad')



SQL Server DELETE con Rollback
Ahora tenemos una tabla con registros ficticios. Ahora hagamos un BORRAR dentro de una TRANSACCIÓN y veamos si podemos retroceder:
BEGIN TRANSACTION
DELETE from Employee where Empid='1'
GO
Eliminamos el registro donde el Empid es igual a 1 y ahora solo tenemos un registro:

Intentemos revertir y ver si podemos recuperar el registro eliminado:
ROLLBACK TRANSACTION
Como puede ver a continuación, lo devolvemos el registro:


SQL Server TRUNCATE con Rollback
Probemos lo mismo para TRUNCATE:
BEGIN TRANSACTION
TRUNCATE TABLE Employee
Ahora hemos truncado la tabla y no tenemos registros, la tabla está vacía:

Intentemos retroceder y ver si podemos recuperar los registros. Ejecute el siguiente comando y vea lo que obtiene:
ROLLBACK TRANSACTION
Como puede ver a continuación, recuperamos los registros.

Conclusión
  • Por lo tanto, podemos deshacer DELETE también TRUNCATE si los comandos se inician dentro de una transacción y no hay diferencia entre DELETE y TRUNCATE si hablamos de rollback.
  • En el performance del servidor el TRUNCATE es más óptimo porque solo se loguea en el transaction log, mientras que el DELETE manda a transacction log todos los registros afectados, lo que es obviamente mucho más costoso a nivel de recursos de I/O.
Referencia: @ldomar.mc
https://zeytol.com








Comentarios

Entradas populares de este blog

HABILITAR Y DESHABILITAR CONSTRAINTS

Para modificar la estructura de una base de datos de Microsoft SQL Server, puede ser necesario desactivar temporalmente las constraints que tenga. Por ejemplo, para vaciar los datos de una base de datos, sin tener que pensar el orden correcto para que no salten las restricciones si tenemos ya claro que queremos vaciarla entera. Nota:  Se aplica a partir de la versión 2016 En SQL Server podemos desactivarlas de una en una, o bien deshabilitar constraints con una instrucción todas las de una tabla. -- Para deshabilitar una única constraint ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint -- Para habilitar una única constraint ALTER TABLE MyTable CHECK CONSTRAINT MyConstraint -- Para deshabilitar todas las constraints de una tabla ALTER TABLE MyTable NOCHECK CONSTRAINT ALL -- Para desabilitar todos los constraint de una tabla ALTER TABLE MyTable CHECK CONSTRAINT ALL Recuerda que, si has cambiado datos de la tabla, al volve...

COLUMNA CALCULADA

Una columna calculada es una columna virtual que no se almacena físicamente en la tabla, a menos que la columna esté marcada como PERSISTA. Una expresión de columna calculada puede usar datos de otras columnas para calcular un valor para la columna a la que pertenece.  Limitaciones: Una columna calculada no se puede usar como una definición de restricción DEFAULT o FOREIGN KEY o con una definición de restricción NOT NULL. Sin embargo, si el valor de la columna calculada se define mediante una expresión determinista y el tipo de datos del resultado está permitido en las columnas de índice, una columna calculada puede usarse como una columna clave en un índice o como parte de cualquier restricción PRIMARY KEY o UNIQUE. Por ejemplo, si la tabla tiene columnas enteras a y b, la columna calculada a + b puede indexarse, pero la columna calculada a + DATEPART (dd, GETDATE ()) no puede indexarse, porque el valor puede cambiar en invocaciones posteriores. ...