Usando SQL Server 2005.
Estoy realizando un gran DELETE FROM sin cláusulas where. Básicamente es equivalente a una declaración TRUNCATE TABLE, excepto que no se me permite usar TRUNCATE. El problema es que la tabla es enorme: 10 millones de filas y lleva más de una hora completarla. ¿Hay alguna manera de hacerlo más rápido sin:
- Usando Truncar
- ¿Deshabilitar o descartar índices?
El t-log ya está en un disco separado.
Cualquier sugerencia bienvenida!
sql-server
performance
delete
tuseau
fuente
fuente
Respuestas:
Lo que puedes hacer es eliminar lotes de esta manera:
Donde xxx es, digamos, 50000
Una modificación de esto, si desea eliminar un porcentaje muy alto de filas ...
fuente
Puede usar la cláusula TOP para hacer esto fácilmente:
fuente
Estoy de acuerdo con las sugerencias para agrupar sus eliminaciones en fragmentos manejables si no puede usar TRUNCATE, y me gusta la sugerencia de soltar / crear por su originalidad, pero tengo curiosidad sobre el siguiente comentario en su pregunta:
Supongo que la razón de esta restricción tiene que ver con la seguridad que se debe otorgar para truncar directamente una tabla y el hecho de que le permitiría truncar tablas que no sean la que le preocupa.
Suponiendo que ese sea el caso, me pregunto si tener un procedimiento almacenado creado que use TRUNCATE TABLE y use "EXECUTE AS" se consideraría una alternativa viable para otorgar los derechos de seguridad necesarios para truncar la tabla directamente.
Con suerte, esto le dará la velocidad que necesita y al mismo tiempo abordará las preocupaciones de seguridad que su empresa puede tener al agregar su cuenta a la función db_ddladmin.
Otra ventaja de usar un procedimiento almacenado de esta manera es que el procedimiento almacenado en sí mismo podría bloquearse para que solo las cuentas específicas puedan usarlo.
Si por alguna razón esta no es una solución aceptable y su necesidad de eliminar los datos de esta tabla es algo que debe hacerse una vez al día / hora / etc., solicitaría que se creara un trabajo de Agente SQL para truncar la tabla a una hora programada cada día.
¡Espero que esto ayude!
fuente
Excepto truncar ... solo eliminar en lotes puede ayudarlo.
Podría soltar la tabla y volver a crearla, con todas las restricciones e índices, por supuesto. En Management Studio tiene la opción de crear una secuencia de comandos para colocar y crear una tabla, por lo que debería ser una opción trivial. Pero esto solo si se le permite hacer acciones DDL, lo que veo que no es realmente una opción.
fuente
Dado que esta pregunta es una referencia tan importante, estoy publicando este código que realmente me ayudó a comprender la eliminación con bucles y también la mensajería dentro de un bucle para rastrear el progreso.
La consulta se modifica a partir de esta pregunta duplicada. Crédito a @RLF para la base de consultas.
fuente