2010-09-02 9 views
2

Je dois supprimer une grande quantité de données. tronquer n'est pas possible à cause des relations. Et je ne veux pas laisser tomber la table à cause des vues. J'utilise le code ci-dessous mais y at-il une meilleure idée?supprimer une grande quantité de données

delete from table 
WHILE 1=1 
BEGIN 
BEGIN TRAN 
DELETE top (1000000) from table 
IF @@rowcount < 1000000 BREAK 
WAITFOR DELAY '00:00:00:010' 
COMMIT 
end 
DELETE from table 
+0

Avez-vous une question? –

Répondre

4

truncate table serait de loin le meilleur. Si vous êtes inquiet des relations en raison de l'intégrité du référentiel, alors je vous suggère de mettre à jour séparément les tables qui le référencent par clé étrangère (par exemple si les clés étrangères ont ON DELETE SET NULL puis UPDATE RefTbl SET Key = NULL WHERE Key IS NOT NULL, de même, supprimez si cascade etc ...).

Sinon, si vous ne voulez pas, vous pouvez modifier votre requête pour être un peu plus rapide en utilisant ROWCOUNT:

--other code for loop 
SET ROWCOUNT 1000000 --this limits the number of rows that will be processed 
DELETE FROM Table1 

Aussi, je ne sais pas pourquoi vous faites cela dans une transaction ? Cela créerait un énorme journal des transactions et aurait un impact sévère sur vos performances ... Lorsque vous effectuez des opérations comme le vidage de contenu de table, les transactions ne sont généralement pas pertinentes (cela pourrait être pertinent dans votre cas, mais je dis simplement que c'est rarement le cas) . Si vous avez besoin d'une transaction, au moins déplacez votre délai ...

1

Vous pouvez le faire un peu plus simple:

delete table where id in (select top 1000000 id from table) 
Questions connexes