2009-11-20 18 views
9

Tenemos una tabla con más de 150 millones de registros. Necesitamos limpiar/eliminar todas las filas. La operación de eliminación demoraría para siempre debido a que está escribiendo en t-logs y no podemos cambiar nuestro modelo de recuperación para toda la base de datos. Hemos probado la opción de tabla truncada.Eliminación masiva (truncar frente a eliminar)

Lo que nos dimos cuenta de que truncar desasigna las páginas de la tabla, y si no estoy equivocado las hace disponibles para su reutilización, pero no reduce automáticamente el DB. Entonces, si queremos reducir el tamaño de la base de datos, realmente tendríamos que ejecutar el comando shrink db luego de truncar la tabla.

¿Es este el procedimiento normal? ¿Hay algo de lo que necesitemos ser cuidadosos o conscientes, o hay mejores alternativas?

Respuesta

1

"Eliminar todas las filas" ... ¿No DROP TABLE (y volver a recrear una vacía con el mismo esquema/índices) ser preferible? (Personalmente me gustan los "nuevos inicios" ;-))

Esta TRUNCATE TABLE es también OK, y sí, es posible que se necesite DBCC SHRINKFILE después si desea recuperar el espacio.

0

Una cosa para recordar con la tabla truncada (así como la tabla desplegable) es que esto no funcionará si alguna vez tiene claves externas que hacen referencia a la tabla.

+0

En SQL Server, 'caer table' no se puede utilizar si hay restricciones de clave externa. http://msdn.microsoft.com/en-us/library/ms173790.aspx – ProKiner

+0

@prokiner tiene que tratar con referencias de claves externas sin importar qué, es decir, si las filas se eliminan, se reducen o se descartan, cualquier registro en otras tablas que hacen referencia a esta (s) fila (s) se deben eliminar primero o se debe eliminar la restricción. En algunos casos, esto puede ser "automatizado" con activadores ON DELETE, pero eso no es aplicable a más de 150 millones de bases de datos tipo. – mjv

+0

@prokiner, debería haber sido más claro.Esos debían ser dos pensamientos separados, solo estaba señalando que el OP había declarado que habían probado el método truncado. He limpiado mi respuesta. –

1

truncate es lo que estás buscando. Si necesita adelgazar la base de datos posteriormente, ejecute una contracción.

Este MSDN refernce (si hablamos de T-SQL) compara el detrás de escena de eliminar filas frente a truncar.

+0

Como han notado otros comentarios, tendrá que lidiar con sus restricciones de clave externa (si las hay), sin importar qué enfoque elija. Mi preferencia sería desactivar las restricciones, 'truncar' la tabla, volver a habilitar las restricciones y luego 'dbcc shirinkfile' (darse un poco de tiempo). – ProKiner

0

Dependiendo del tamaño de la base de datos completa, la contracción puede tardar un tiempo; He descubierto que va más rápido si se encoge en pedazos más pequeños, en lugar de tratar de recuperarlo todo de una vez.

0

Tiene una solución normal (truncar + contraer db) para eliminar todos los registros de una tabla.

Como señaló Irwin. El comando TRUNCATE no funcionará mientras se hace referencia a él mediante una restricción de clave externa. Entonces, primero suelte las restricciones, trunque la tabla y vuelva a crear las restricciones.

Si su preocupación por el rendimiento y se trata de una rutina regular para su sistema. Es posible que desee examinar moviendo esta tabla a su propio archivo de datos, luego ejecutar reducir solo contra el archivo de datos de destino!

0

Como se ha señalado, si no se puede utilizar o dejar truncado

SELECT 1 
WHILE @@ROWCOUNT <> 0 
    DELETE TOP (100000) MyTable 
+0

Puede usar truncar o soltar, sin embargo, son posibles consideraciones con cualquier operación (borrar, soltar, truncar) que deberá tenerse en cuenta. – Chad

Cuestiones relacionadas