2010-10-21 5 views

Respuesta

8

Copie las filas que no desea eliminar en una tabla temporal utilizando select into, y luego truncate en lugar de eliminar la tabla. Copie las filas nuevamente en la tabla anterior. Recuerde primero drop contraints.

Si tiene columnas de identidad, después de renter los datos, use algo como esto para resembrar la tabla.

declare @seed int 
select @seed = max(identity_col)+1 from tableName 
DBCC CHECKIDENT (orders, table_name, @seed) 
+0

¡agradable! Tengo columnas de identidad, así que tendría que lidiar con eso, pero está bien. – Rory

+1

+1 - Esto está mínimamente conectado al menos en 2005+ (no estoy seguro de las versiones anteriores) por lo que debe ser muy rápido. Tenga en cuenta el tiempo necesario para reconstruir los índices. – JNK

2

Dado que desea eliminar el 90% de filas, que podría ser más rápida de SELECT INTO esos 10% filas que desea conservar en una tabla nueva.

1

Si no puede copiar el resto a otra mesa, a continuación, truncar y copiar de nuevo ...

... dejando caer los índices es lo único que puede hacer la programación inteligente. En este caso, bajar índices y recrearlos puede ayudar.

... u obtén un subsistema de disco más rápido, principalmente para los datos.

El modo de recuperación no funciona: el modo de recuperación indica que el registro se puede eliminar inmediatamente después de la confirmación (puede estar implícito), pero no hay nada que evite que las entradas de registro se escriban.

1

Agregue un indicador IsDeleted (BIT), configúrelo en 1 para esos 90% y cree una vista sobre su tabla que solo muestre las filas con IsDeleted=0.

Eliminar es siempre a) una operación que consume muchos recursos, yb) destruye cualquier posibilidad de responsabilidad: intentaría evitarla si fuera posible, por ambas razones (rendimiento y destrucción de datos). Utilice el enfoque de "eliminación suave" en su lugar.

Cuestiones relacionadas