2010-09-28 4 views
2

Laquelle des deux instructions suivantes considérez-vous comme la plus efficace pour supprimer un grand nombre de lignes?optimisation de l'instruction DELETE avec un nombre

Déclaration n ° 1:

DELETE TOP (@count) FROM ProductInfo WHERE productId = @productid 

Déclaration n ° 2: table dérivé

DELETE t1 FROM (SELECT TOP (@count) * from ProductInfo 
       WHERE productId = @productId v) t1 

Répondre

6

deux et non plus. Vous devez supprimer en lots lorsque vous traitez un grand nombre, en raison de problèmes de croissance de journal de transaction unique. En supposant que vous voulez supprimer tous les enregistrements pour un @productId donné:

declare @batchSize int = 10000; 
do while(1=1) 
begin 
    delete top(@batchSize) from ProductInfo where productId = @productId; 
    if (0 = @@rowcount) 
     break; 
end 

Les deux formes de SUPPRIMER vous sont fondamentalement identiques au courant, la chose importante est que la table est organisée par une clé en cluster basé sur la touche productId. Si ce n'est pas vrai et que vous avez un index CN sur productId alors le @batchSize doit être calibré pour éviter le index tipping point.

+0

1. Que se passe-t-il si l'instruction delete échoue? Est-ce que ça continue dans la boucle while? 2. Que se passe-t-il si la suppression échoue, définit-elle rowcount = 0 et quitte faussement la boucle? – RPS

+0

L'ajout de la gestion des erreurs à chaque exemple d'exemple pourrait gonfler l'échantillon et diluer la valeur de l'exemple. Mais si vous demandez explicitement la gestion des erreurs, alors je vous recommande de l'encapsuler dans un bloc BEGIN TRY/BEGIN CATCH. Vous devez ensuite traiter l'erreur de manière appropriée, en fonction de l'erreur. –

+0

Une @batchSize de cette taille entraînera l'escalade de verrouillage, sauf si elle a été spécifiquement désactivée par diverses méthodes. – etliens

2

Puisque les deux requêtes effectuent la même tâche exacte, j'utiliser le premier, car il est plus simple à lire et comprend.

(De plus, puisque les deux requêtes font le même travail, je pense qu'ils avaient générer le même plan d'exécution - pouvez-vous vérifier?)

Questions connexes