Estoy tratando de comprender mejor las diferencias entre los comandos DELETE
y TRUNCATE
. Mi comprensión de los aspectos internos va algo así como:
DELETE
-> el motor de base de datos encuentra y elimina la fila de las páginas de datos relevantes y todas las páginas de índice donde se ingresa la fila. Por lo tanto, cuantos más índices, más tiempo tarda la eliminación.
TRUNCATE
-> simplemente elimina todas las páginas de datos de la tabla en masa, lo que lo convierte en una opción más eficiente para eliminar el contenido de una tabla.
Asumiendo que lo anterior es correcto (corríjame si no):
- ¿Cómo afectan los diferentes modos de recuperación a cada declaración? Si hay algún efecto en absoluto
- Al eliminar, ¿se escanean todos los índices o solo aquellos donde está la fila? Supongo que todos los índices se escanean (¿y no se buscan?)
- ¿Cómo se replican los comandos? ¿El comando SQL se envía y procesa en cada suscriptor? ¿O es MSSQL un poco más inteligente que eso?
sql-server
database-internals
Stuart Blackler
fuente
fuente
DELETE
yTRUNCATE
en las respuestas a esta pregunta sobre la utilidad deTRUNCATE
-ing inmediatamente antes de aDROP
. También puede buscar en el registro usted mismo para estudiar los efectos de ambos comandos utilizando la técnica descrita en esta respuesta .TRUNCATE
puede revertirse. Nick lo cubre en su respuesta a la pregunta que vincula .Respuestas:
Sí, aunque hay dos opciones aquí. Las filas se pueden eliminar de los índices no agrupados fila por fila por el mismo operador que realiza las eliminaciones de la tabla base. Esto se conoce como un plan de actualización estrecho (o por fila):
O bien, las eliminaciones de índice no agrupadas pueden ser realizadas por operadores separados, uno por índice no agrupado. En este caso (conocido como un plan de actualización amplio o por índice), el conjunto completo de acciones se almacena en una mesa de trabajo (spool ansioso) antes de reproducirse una vez por índice, a menudo ordenadas explícitamente por las claves particulares del índice no agrupado para fomentar una secuencial patrón de acceso.
Sí.
TRUNCATE TABLE
es más eficiente por varias razones:La eliminación siempre se registra por completo (cada fila eliminada se registra en el registro de transacciones). Existen algunas pequeñas diferencias en el contenido de los registros de anotaciones si el modelo de recuperación es distinto de
FULL
, pero todavía es técnicamente un registro completo.Eliminar una fila en un índice (usando los planes de actualización estrechos o anchos mostrados anteriormente) siempre es un acceso por clave (una búsqueda). Escanear todo el índice para cada fila eliminada sería terriblemente ineficiente. Veamos nuevamente el plan de actualización por índice mostrado anteriormente:
Los planes de ejecución son conductos impulsados por la demanda: los operadores principales (a la izquierda) impulsan a los operadores secundarios para que hagan el trabajo al solicitarles una fila a la vez. Los operadores de clasificación están bloqueando (deben consumir toda su entrada antes de producir la primera fila ordenada), pero aún están siendo controlados por su padre (la eliminación de índice) que solicita esa primera fila. La eliminación de índice extrae una fila a la vez del ordenamiento completado, actualizando el índice no agrupado de destino para cada fila.
En un plan de actualización amplio, a menudo verá que el operador de actualización de la tabla base agrega columnas al flujo de filas. En este caso, la eliminación de índice agrupado agrega columnas de clave de índice no agrupadas a la secuencia. El motor de almacenamiento requiere estos datos para ubicar la fila que se eliminará del índice no agrupado:
El truncamiento no está permitido en una tabla que se publica mediante replicación transaccional o de fusión. La forma en que se replican las eliminaciones depende del tipo de replicación y de cómo se configura. Por ejemplo, la replicación de instantáneas simplemente replica una vista de la tabla en un punto en el tiempo utilizando métodos masivos: los cambios incrementales no se rastrean ni se aplican. La replicación transaccional funciona leyendo registros de registros y generando transacciones apropiadas para aplicar los cambios a los suscriptores. La replicación de fusión rastrea los cambios utilizando desencadenantes y tablas de metadatos.
Lectura relacionada: optimización de consultas T-SQL que cambian datos
fuente