2010-10-21 1 views

risposta

8

Copia le righe che non vuoi eliminare in una tabella temporanea utilizzando select into e quindi truncate la tabella anziché eliminare. Copia le righe nella vecchia tabella. Ricordare prima il numero drop contraints.

Se si dispone di colonne di identità, dopo aver preso in affitto i dati, utilizzare qualcosa come questo per eseguire il reseeding della tabella.

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

bello! Ho colonne di identità quindi dovrei occuparmene, ma va bene. – Rory

+1

+1 - Questo è minimo registrato almeno dal 2005 (non sono sicuro delle versioni precedenti) quindi dovrebbe essere super veloce. Ricordare il tempo necessario per ricostruire gli indici. – JNK

2

Dato che si desidera eliminare il 90% di righe, potrebbe essere più veloce per SELECT INTO quei 10% righe che si desidera conservare in una nuova tabella.

1

Se non è possibile copiare il resto a un altro tavolo, poi tronca e copiare di nuovo ...

... lasciando cadere gli indici è l'unica cosa che si può fare la programmazione saggia. In questo caso è possibile ridurre gli indici e ricrearli.

... o ottenere un sottosistema di dischi più veloce, principalmente per i dati.

La modalità di ripristino non aiuta - la modalità di ripristino indica che il registro è cancellabile immediatamente dopo il commit (può essere implicito), ma non c'è nulla in esso che eviti che le voci del registro vengano scritte.

1

Aggiungi un IsDeleted (BIT) contrassegno, imposta quello a 1 per quelli 90% e crea una visualizzazione sulla tabella che mostra solo le righe con IsDeleted=0.

L'eliminazione è sempre a) un'operazione a uso intensivo di risorse eb) distrugge qualsiasi possibilità di responsabilità. Cercherò di evitarlo, se possibile, per entrambi i motivi (prestazioni e distruzione dei dati). Usa invece l'approccio "soft delete".