¿Cuál es la diferencia entre TRUNCATE
yDELETE
en SQL?
Si su respuesta es específica de la plataforma, indíquelo.
¿Cuál es la diferencia entre TRUNCATE
yDELETE
en SQL?
Si su respuesta es específica de la plataforma, indíquelo.
Respuestas:
Aquí hay una lista de diferencias. He resaltado las características específicas de Oracle, y espero que la comunidad pueda agregar también la diferencia específica de otros proveedores. Las diferencias que son comunes a la mayoría de los proveedores pueden ir directamente debajo de los encabezados, con las diferencias resaltadas a continuación.
Si desea eliminar rápidamente todas las filas de una tabla, y está realmente seguro de que desea hacerlo, y no tiene claves foráneas en las tablas, entonces un TRUNCATE probablemente será más rápido que DELETE. .
Se deben considerar varios problemas específicos del sistema, como se detalla a continuación.
Eliminar es DML, Truncar es DDL ( ¿Qué es DDL y DML? )
Variable por vendedor
Servidor SQL
Truncar puede revertirse.
PostgreSQL
Truncar puede revertirse.
Oráculo
Debido a que un TRUNCATE es DDL, involucra dos commits, uno antes y otro después de la ejecución de la declaración. Truncar, por lo tanto, no se puede revertir, y una falla en el proceso de truncado habrá emitido una confirmación de todos modos.
Sin embargo, vea Flashback a continuación.
Eliminar no recupera espacio, Truncar recupera espacio
Oráculo
Si utiliza la cláusula REUSE STORAGE, los segmentos de datos no se desasignan, lo que puede ser marginalmente más eficiente si la tabla se va a volver a cargar con datos. La marca de nivel máximo se restablece.
Eliminar se puede utilizar para eliminar todas las filas o solo un subconjunto de filas. Truncar elimina todas las filas.
Oráculo
Cuando se divide una tabla, las particiones individuales se pueden truncar de forma aislada, por lo que es posible una eliminación parcial de todos los datos de la tabla.
Eliminar se puede aplicar a tablas y tablas dentro de un clúster. Truncar se aplica solo a las tablas o al clúster completo. (Puede ser específico de Oracle)
Oráculo
Eliminar no afecta la identificación del objeto de datos, pero truncar asigna una nueva identificación de objeto de datos a menos que nunca haya habido una inserción en la tabla desde su creación Incluso una sola inserción que se revierte hará que se asigne una nueva identificación de objeto de datos al truncamiento .
Flashback funciona a través de eliminaciones, pero un truncamiento previene flashback a estados previos a la operación.
Sin embargo, a partir de 11gR2, la función FLASHBACK ARCHIVE lo permite, excepto en Express Edition
Uso de FLASHBACK en Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
Variable
Oráculo
La eliminación se puede otorgar en una tabla a otro usuario o rol, pero el truncamiento no se puede realizar sin usar una concesión DROP ANY TABLE.
Eliminar genera una pequeña cantidad de rehacer y una gran cantidad de deshacer. Truncar genera una cantidad insignificante de cada uno.
Oráculo
Una operación truncada vuelve a utilizar los índices inutilizables. Eliminar no lo hace.
No se puede aplicar un truncamiento cuando una clave externa habilitada hace referencia a la tabla. El tratamiento con eliminar depende de la configuración de las claves externas.
Oráculo
Truncar requiere un bloqueo de tabla exclusivo, eliminar requiere un bloqueo de tabla compartido. Por lo tanto, deshabilitar los bloqueos de tabla es una forma de evitar operaciones truncadas en una tabla.
Los disparadores DML no se disparan en un truncado.
Oráculo
Los desencadenadores DDL están disponibles.
Oráculo
Truncar no se puede emitir a través de un enlace de base de datos.
Servidor SQL
Truncar restablece la secuencia para los tipos de columna IDENTIDAD, la eliminación no.
En la mayoría de las implementaciones, una DELETE
declaración puede devolver al cliente las filas que se eliminaron.
Por ejemplo, en un subprograma de Oracle PL / SQL usted podría:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
La diferencia entre truncar y eliminar se enumera a continuación:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
SOLTAR
El comando DROP elimina una tabla de la base de datos. También se eliminarán todas las filas, índices y privilegios de las tablas. No se dispararán disparadores DML. La operación no se puede revertir.
TRUNCAR
TRUNCATE elimina todas las filas de una tabla. La operación no se puede revertir y no se activarán disparadores. Como tal, TRUNCATE es más rápido y no utiliza tanto espacio para deshacer como un DELETE. El bloqueo de nivel de tabla se agregará al truncar.
ELIMINAR
El comando DELETE se usa para eliminar filas de una tabla. Se puede usar una cláusula WHERE para eliminar solo algunas filas. Si no se especifica la condición WHERE, se eliminarán todas las filas. Después de realizar una operación ELIMINAR, debe COMENZAR o RODAR la transacción para que el cambio sea permanente o para deshacerlo. Tenga en cuenta que esta operación hará que se activen todos los desencadenantes DELETE en la tabla. El bloqueo de nivel de fila se agregará al eliminar.
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
Todas buenas respuestas, a lo que debo agregar:
Dado que TRUNCATE TABLE
es un comando DDL ( Lenguaje de definición de datos ), no un comando DML ( Lenguaje de manipulación de datos ), Delete Triggers
no se ejecuta.
Resumen de Eliminar Vs Truncar en el servidor SQL
Para ver el artículo completo, siga este enlace: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Tomado del artículo de dotnet mob: Delete Vs Truncate in SQL Server
Con SQL Server o MySQL, si hay una PK con incremento automático, truncar restablecerá el contador.
DBCC CHECKIDENT (table_name, RESEED, 1)
"Truncar no registra nada" es correcto. Yo iría más lejos:
Truncar no se ejecuta en el contexto de una transacción.
La ventaja de velocidad de truncar sobre eliminar debería ser obvia. Esa ventaja varía de trivial a enorme, dependiendo de su situación.
Sin embargo, he visto truncar sin querer romper la integridad referencial y violar otras restricciones. El poder que obtienes modificando los datos fuera de una transacción tiene que equilibrarse con la responsabilidad que heredas cuando caminas por la cuerda floja sin una red.
TRUNCATE
es la declaración DDL mientras que DELETE
es una declaración DML. A continuación se presentan las diferencias entre los dos:
Como TRUNCATE
es una declaración DDL ( lenguaje de definición de datos ), no requiere una confirmación para que los cambios sean permanentes. Y esta es la razón por la cual las filas eliminadas por truncamiento no se pudieron revertir. Por otro lado, DELETE
es una declaración DML ( lenguaje de manipulación de datos ), por lo tanto, requiere una confirmación explícita para que su efecto sea permanente.
TRUNCATE
siempre elimina todas las filas de una tabla, dejando la tabla vacía y la estructura de la tabla intacta, mientras que DELETE
puede eliminar condicionalmente si se usa la cláusula where.
Las filas eliminadas por la TRUNCATE TABLE
declaración no se pueden restaurar y no puede especificar la cláusula where en la TRUNCATE
declaración.
TRUNCATE
declaraciones no dispara los disparadores en lugar de en el gatillo de borrar en DELETE
la declaración
Aquí está el muy buen enlace relevante para el tema.
Sí, DELETE es más lento, TRUNCATE es más rápido. ¿Por qué?
DELETE debe leer los registros, verificar las restricciones, actualizar el bloque, actualizar los índices y generar rehacer / deshacer. Todo eso lleva tiempo.
TRUNCATE simplemente ajusta un puntero en la base de datos para la tabla (High Water Mark) y poof! Los datos se han ido.
Esto es específico de Oracle, AFAIK.
TRUNCAR
La consulta TRUNCATE SQL elimina todas las filas de una tabla, sin registrar las eliminaciones de filas individuales.
ELIMINAR
Para ejecutar una cola DELETE, se requieren permisos de eliminación en la tabla de destino. Si necesita usar una cláusula WHERE en un DELETE, también se requieren permisos de selección.
Si accidentalmente eliminó todos los datos de la tabla usando Eliminar / Truncar. Puede revertir la transacción confirmada. Restaure la última copia de seguridad y ejecute el registro de transacciones hasta el momento en que Eliminar / Truncar está a punto de suceder.
La siguiente información relacionada es de una publicación de blog :
Mientras trabajamos en la base de datos, estamos usando Eliminar y Truncar sin conocer las diferencias entre ellos. En este artículo discutiremos la diferencia entre Eliminar y Truncar en SQL.
Eliminar:
- Eliminar es un comando DML.
- La declaración de eliminación se ejecuta utilizando un bloqueo de fila, cada fila de la tabla está bloqueada para su eliminación.
- Podemos especificar filtros en la cláusula where.
- Elimina los datos especificados si existe una condición.
- Eliminar actividades un desencadenante porque la operación se registra individualmente.
- Más lento que truncar porque mantiene registros
Truncar
- Truncar es un comando DDL.
- Truncar tabla siempre bloquea la tabla y la página, pero no cada fila, ya que elimina todos los datos.
- No se puede usar Donde condición.
- Elimina todos los datos.
- Truncar tabla no puede activar un desencadenador porque la operación no registra eliminaciones de filas individuales.
- Más rápido en cuanto a rendimiento, porque no guarda ningún registro.
Nota: Eliminar y Truncar pueden revertirse cuando se usan con Transaction. Si la transacción se realiza, significa comprometido, entonces no podemos revertir el comando Truncar, pero aún podemos revertir el comando Eliminar de los archivos de registro, ya que eliminar escribir los registra en el archivo de registro en caso de que sea necesario retroceder en el futuro a partir de los archivos de registro.
Si tiene una restricción de clave externa que se refiere a la tabla que está intentando truncar, esto no funcionará incluso si la tabla de referencia no contiene datos. Esto se debe a que la comprobación de la clave externa se realiza con DDL en lugar de DML. Esto se puede solucionar deshabilitando temporalmente las restricciones de clave externa en la tabla.
Eliminar tabla es una operación registrada. Por lo tanto, la eliminación de cada fila se registra en el registro de transacciones, lo que lo hace lento. Truncar tabla también elimina todas las filas de una tabla, pero no registrará la eliminación de cada fila, sino que registrará la desasignación de las páginas de datos de la tabla, lo que lo hace más rápido.
~ Si accidentalmente eliminó todos los datos de la tabla usando Eliminar / Truncar. Puede revertir la transacción confirmada. Restaure la última copia de seguridad y ejecute el registro de transacciones hasta el momento en que Eliminar / Truncar está a punto de suceder.
En SQL Server 2005, creo que puede deshacer un truncamiento
ELIMINAR
El comando DELETE se usa para eliminar filas de una tabla. Se puede usar una cláusula WHERE para eliminar solo algunas filas. Si no se especifica la condición WHERE, se eliminarán todas las filas. Después de realizar una operación ELIMINAR, debe COMENZAR o RODAR la transacción para que el cambio sea permanente o para deshacerlo. Tenga en cuenta que esta operación hará que se activen todos los desencadenantes DELETE en la tabla.
TRUNCAR
TRUNCATE elimina todas las filas de una tabla. La operación no se puede revertir y no se activarán disparadores. Como tal, TRUCATE es más rápido y no usa tanto espacio para deshacer como un DELETE.
SOLTAR
El comando DROP elimina una tabla de la base de datos. También se eliminarán todas las filas, índices y privilegios de las tablas. No se dispararán disparadores DML. La operación no se puede revertir.
DROP y TRUNCATE son comandos DDL, mientras que DELETE es un comando DML. Por lo tanto, las operaciones DELETE pueden revertirse (deshacerse), mientras que las operaciones DROP y TRUNCATE no pueden revertirse.
De: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE puede revertirse si se envuelve en una transacción.
Consulte las dos referencias a continuación y pruébelo usted mismo:
TRUNCATE vs. DELETE es una de las preguntas infames durante las entrevistas SQL. Solo asegúrese de explicárselo correctamente al entrevistador o podría costarle el trabajo. El problema es que no muchos lo saben, lo más probable es que consideren que la respuesta es incorrecta si les dice que YES Truncate puede revertirse.
Una pequeña corrección a la respuesta original: eliminar también genera cantidades significativas de rehacer (ya que deshacer está protegido por rehacer). Esto se puede ver en la salida de autotrace:
SQL> delete from t1;
10918 rows deleted.
Elapsed: 00:00:00.58
Execution Plan
----------------------------------------------------------
0 DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
1 0 DELETE OF 'T1'
2 1 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)
Statistics
----------------------------------------------------------
30 recursive calls
12118 db block gets
213 consistent gets
142 physical reads
3975328 redo size
441 bytes sent via SQL*Net to client
537 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
10918 rows processed
Aquí está mi respuesta detallada sobre la diferencia entre DELETE y TRUNCATE en SQL Server
• Eliminar datos : lo primero es lo primero, ambos se pueden utilizar para eliminar las filas de la tabla.
Pero un DELETE puede usarse para eliminar las filas no solo de una Tabla, sino también de una VIEW o el resultado de un OPENROWSET u OPENQUERY sujeto a las capacidades del proveedor.
• Cláusula FROM : con DELETE también puede eliminar filas de una tabla / view / rowset_function_limited en función de las filas de otra tabla utilizando otra cláusula FROM. En esa cláusula FROM también puedes escribir condiciones normales de JOIN. En realidad, puede crear una declaración DELETE a partir de una declaración SELECT que no contenga ninguna función agregada reemplazando SELECT con DELETE y eliminando los nombres de columna.
Con TRUNCATE no puedes hacer eso.
• DONDE : un TRUNCATE no puede tener condiciones WHERE, pero un DELETE sí. Eso significa que con TRUNCATE no puede eliminar una fila específica o un grupo específico de filas. TRUNCATE TABLE es similar a la instrucción DELETE sin cláusula WHERE.
• Rendimiento : TRUNCATE TABLE es más rápido y utiliza menos recursos del sistema y del registro de transacciones. Y una de las razones son los bloqueos utilizados por cualquiera de las declaraciones. La instrucción DELETE se ejecuta utilizando un bloqueo de fila, cada fila de la tabla está bloqueada para su eliminación. TRUNCATE TABLE siempre bloquea la tabla y la página, pero no cada fila.
• Registro de transacciones : la instrucción DELETE elimina las filas de una en una y crea entradas individuales en el registro de transacciones para cada fila.
TRUNCATE TABLE elimina los datos al desasignar las páginas de datos utilizadas para almacenar los datos de la tabla y registra solo las desasignaciones de páginas en el registro de transacciones.
• Páginas : después de ejecutar una instrucción DELETE, la tabla aún puede contener páginas vacías. TRUNCATE elimina los datos al desasignar las páginas de datos utilizadas para almacenar los datos de la tabla.
• Disparador : TRUNCATE no activa los disparadores de eliminación en la tabla. Por lo tanto, debe tener mucho cuidado al usar TRUNCATE. Uno nunca debe usar un TRUNCATE si eliminar Trigger está definido en la tabla para realizar una limpieza automática o una acción de registro cuando se eliminan las filas.
• Columna de identidad : con TRUNCATE si la tabla contiene una columna de identidad, el contador de esa columna se restablece al valor inicial definido para la columna. Si no se definió ninguna semilla, se usa el valor predeterminado 1. DELETE no restablece el contador de identidad. Entonces, si desea conservar el contador de identidad, use DELETE en su lugar.
• Replicación : DELETE se puede usar contra la tabla utilizada en la replicación transaccional o la replicación de fusión.
Si bien TRUNCATE no se puede usar contra las tablas involucradas en la replicación transaccional o la replicación de fusión.
• Revertir : la declaración DELETE puede revertirse.
TRUNCATE también puede revertirse siempre que esté encerrado en un bloque TRANSACTION y la sesión no esté cerrada. Una vez que se cierra la sesión, no podrá deshacer TRUNCATE.
• Restricciones : la instrucción DELETE puede fallar si viola un activador o intenta eliminar una fila referenciada por datos en otra tabla con una restricción FOREIGN KEY. Si DELETE elimina varias filas y cualquiera de las filas eliminadas viola un desencadenante o restricción, la declaración se cancela, se devuelve un error y no se eliminan filas.
Y si DELETE se usa contra View, esa vista debe ser una vista actualizable. TRUNCATE no se puede utilizar contra la tabla utilizada en la Vista indizada.
TRUNCATE no se puede usar contra la tabla a la que hace referencia una restricción FOREIGN KEY, a menos que una tabla que tenga una clave foránea que se haga referencia a sí misma.
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
La mayor diferencia es que truncar es una operación no registrada mientras que eliminar es.
Simplemente significa que en caso de un bloqueo de la base de datos, no puede recuperar los datos operados por truncamiento, pero con la eliminación puede.
Más detalles aquí
Declaración DELETE: este comando elimina solo las filas de la tabla en función de la condición dada en la cláusula where o elimina todas las filas de la tabla si no se especifica ninguna condición. Pero no libera el espacio que contiene la tabla.
La sintaxis de una instrucción DELETE de SQL es:
DELETE FROM nombre_tabla [condición WHERE];
Sentencia TRUNCATE: este comando se utiliza para eliminar todas las filas de la tabla y liberar el espacio que contiene la tabla.
ELIMINAR
DELETE is a DML command DELETE you can rollback Delete = Only Delete- so it can be rolled back In DELETE you can write conditions using WHERE clause Syntax – Delete from [Table] where [Condition]
TRUNCAR
TRUNCATE is a DDL command You can't rollback in TRUNCATE, TRUNCATE removes the record permanently Truncate = Delete+Commit -so we can't roll back You can't use conditions(WHERE clause) in TRUNCATE Syntax – Truncate table [Table]
Para más detalles visite
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
En resumen, truncar no registra nada (por lo que es mucho más rápido pero no se puede deshacer), mientras que eliminar se registra (y puede ser parte de una transacción más grande, revertirá, etc.). Si tiene datos que no desea en una tabla en dev, normalmente es mejor truncar ya que no corre el riesgo de llenar el registro de transacciones
Una gran razón por la que es útil es cuando necesita actualizar los datos en una tabla de filas de varios millones, pero no desea reconstruirlos. "Eliminar *" llevaría una eternidad, mientras que el impacto de Truncate sería insignificante.
No se puede hacer DDL en un enlace doble.
No es que truncar no registre nada en SQL Server. truncate no registra ninguna información pero registra la desasignación de la página de datos para la tabla en la que activó TRUNCATE.
y el registro truncado puede revertirse si definimos la transacción al principio y podemos recuperar el registro truncado después de revertirlo. Pero no puede recuperar registros truncados de la copia de seguridad del registro de transacciones después de la transacción truncada confirmada.
Truncar también puede revertirse aquí la exapmle
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
Truncar y Eliminar en SQL son dos comandos que se utilizan para eliminar o eliminar datos de la tabla. Aunque de naturaleza bastante básica, ambos comandos SQL pueden crear muchos problemas hasta que esté familiarizado con los detalles antes de usarlo. Una elección incorrecta de comando puede resultar en un proceso muy lento o incluso puede explotar el segmento de registro, si es necesario eliminar demasiados datos y el segmento de registro no es suficiente. Es por eso que es fundamental saber cuándo usar el comando truncar y eliminar en SQL, pero antes de usarlos debe conocer las diferencias entre truncar y eliminar, y en función de ellos, deberíamos poder saber cuándo DELETE es la mejor opción para eliminar Los datos o TRUNCATE deben usarse para purgar tablas.
Consulte cheque haga clic aquí
La instrucción DELETE puede tener una cláusula WHERE para eliminar registros específicos, mientras que la instrucción TRUNCATE no requiere ninguna y borra toda la tabla. Es importante destacar que la instrucción DELETE registra la fecha eliminada mientras que la instrucción TRUNCATE no.
Una diferencia más específica para el servidor microsoft sql es delete
que puede usar una output
declaración para rastrear qué registros se han eliminado, por ejemplo:
delete from [SomeTable]
output deleted.Id, deleted.Name
No puedes hacer esto con truncate
.