2009-04-27 8 views
14

Nos hemos topado con una situación un poco extraña. Básicamente, hay dos tablas en una de nuestras bases de datos que reciben toneladas y toneladas de información de registro que no necesitamos o no nos interesan. Parcialmente debido a esto, nos estamos quedando sin espacio en el disco.¿Cuál es la mejor manera de eliminar toda una tabla grande en t-sql?

Estoy tratando de limpiar las mesas, pero se está tomando para siempre (todavía hay 57,000,000+ registros después de dejar esta carrera el fin de semana ... y eso es sólo la primera tabla!)

Simplemente usando eliminar La tabla demora mucho tiempo y consume espacio en el disco (creo que debido al registro de transacciones). En este momento estoy usando un ciclo while para borrar registros de X a la vez, mientras juego con X para determinar qué es realmente más rápido. Por ejemplo, X = 1000 toma 3 segundos, mientras que X = 100,000 toma 26 segundos ... lo cual al hacer las matemáticas es un poco más rápido.

Pero la pregunta es si hay una manera mejor o no?

(Una vez hecho esto, va a ejecutar un trabajo del Agente SQL ir limpiar la mesa a cabo una vez al día ... pero necesitan que se aclaró en primer lugar.)

+0

¿Está la eliminación de todos los registros en la tabla? –

+0

Esto no es de GFI ¿verdad? –

+0

No sé qué es GFI ... así que probablemente no. – CodeRedick

Respuesta

20

TRUNCATE la mesa o desactivar los índices antes de eliminar

TRUNCATE TABLE [tablename] 

Truncar eliminará todos los registros de la tabla sin registrar cada eliminación por separado.

+1

vale la pena vincular a http://en.wikipedia.org/wiki/Truncate_(SQL) como un salto para asegurarse de que entienden las limitaciones, pero de todo corazón está de acuerdo con el consejo – ShuggyCoUk

+1

Podría valer la pena mencionar, que para 'IDENTIDAD 'columns a' TRUNCATE' significa que el siguiente valor 'INSERT'ed obtendrá un valor de identidad de' SEED' de la tabla (generalmente 1). Esto puede no ser siempre deseado. – Oliver

2
TRUNCATE TABLE [tablename] 

eliminará todos los registros sin iniciar sesión.

+1

hará un poco de registro mínimo, solo registrará páginas y extensiones afectadas – SQLMenace

4

1) truncar la tabla

2) guión en la tabla, eliminar y reconstruir la tabla

2

Dependiendo de la cantidad que desea conservar, puede simplemente copiar los registros que desea una tabla temporal, truncar la tabla de registro y copiar los registros de la tabla temporal a la tabla de registro.

7

Para agregar a las otras respuestas, si desea conservar los datos del día anterior (o el mes o año pasado o lo que sea), guárdelo, realice TRUNCATE TABLE y vuelva a insertarlo en la tabla original:

SELECT 
    * 
INTO 
    tmp_My_Table 
FROM 
    My_Table 
WHERE 
    <Some_Criteria> 

TRUNCATE TABLE My_Table 

INSERT INTO My_Table SELECT * FROM tmp_My_Table 

La siguiente cosa a hacer es preguntarse por qué vas a insertar toda esta información en un registro si nadie se preocupa por ella. Si realmente no lo necesita, apague el registro en la fuente.

+0

Software de terceros ... :( – CodeRedick

+0

Tiene mis condolencias;) –

0

Si puede calcular la x óptima, esta iterará constantemente alrededor de la eliminación a la velocidad más rápida. Establecer el recuento de filas limita el número de registros que se eliminarán en cada paso del ciclo. Si el archivo de registro se está haciendo demasiado grande; pegue un contador en el bucle y trunque cada millón de filas más o menos.

conjunto @@ recuento de filas x mientras que 1 = 1 Begin

Borrar de la tabla Si @@ recuento de filas = 0 ruptura

Fin

Cambiar el modo de registro en la base de datos de simple o el registro masivo reducirá parte de la sobrecarga de eliminación.

Cuestiones relacionadas