ELIMINAR vs TRUNCAR

35

Estoy tratando de comprender mejor las diferencias entre los comandos DELETEy 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):

  1. ¿Cómo afectan los diferentes modos de recuperación a cada declaración? Si hay algún efecto en absoluto
  2. 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?)
  3. ¿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?
Stuart Blackler
fuente
2
Hay alguna información relacionada sobre DELETEy TRUNCATEen las respuestas a esta pregunta sobre la utilidad de TRUNCATE-ing inmediatamente antes de a DROP. También puede buscar en el registro usted mismo para estudiar los efectos de ambos comandos utilizando la técnica descrita en esta respuesta .
Nick Chammas
1
Esta respuesta muestra los aspectos internos de las operaciones DELETE y TRUNCATE. Además, la pregunta demuestra una situación particular en la que TRUNCATE funciona mejor.
孔夫子
55
@idstam TRUNCATEpuede revertirse. Nick lo cubre en su respuesta a la pregunta que vincula .
Mark Storey-Smith
Truncar requiere el permiso "alterar tabla" (en el sentido de que truncar es un complemento en reemplazo de eliminar).
crokusek

Respuestas:

58

BORRAR -> 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.

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):

Por eliminación de 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.

Por eliminación de índice

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.

Sí. TRUNCATE TABLEes más eficiente por varias razones:

  1. Es posible que se necesiten menos cerraduras. El truncamiento generalmente requiere solo un bloqueo de modificación de esquema único a nivel de tabla (y bloqueos exclusivos en cada extensión desasignada). La eliminación puede adquirir bloqueos con una granularidad inferior (fila o página), así como bloqueos exclusivos en cualquier página desasignada.
  2. Solo el truncamiento garantiza que todas las páginas se desasignen de una tabla de montón. La eliminación puede dejar páginas vacías en un montón, incluso si se especifica una sugerencia de bloqueo de tabla exclusiva (por ejemplo, si se habilita un nivel de aislamiento de versiones de fila para la base de datos).
  3. El truncamiento siempre se registra mínimamente (independientemente del modelo de recuperación en uso). Solo las operaciones de desasignación de páginas se registran en el registro de transacciones.
  4. El truncamiento puede usar la caída diferida si el objeto tiene 128 extensiones o más de tamaño. La caída diferida significa que el trabajo de desasignación real se realiza de forma asíncrona por un subproceso de servidor en segundo plano.

¿Cómo afectan los diferentes modos de recuperación a cada declaración? ¿Hay algún efecto en absoluto?

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.

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?)

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:

Plano ancho 2

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:

Detalle de la lista de salida

¿Cómo se replican los comandos? ¿El comando SQL se envía y procesa en cada suscriptor? ¿O es SQL Server un poco más inteligente que eso?

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

Paul White dice GoFundMonica
fuente