Problème de suppression de SQL Server

J'ai une database SQL Server où je supprime des lignes de trois tables A,B,C dans des lots avec des conditions à travers un script SQL planifié dans un travail SQL. Le travail s'exécute pendant 2 heures car les tables contiennent une grande quantité de données. Pendant que le travail est en cours d'exécution, mon application frontale n'est pas accessible (erreur de dépassement de timeout) car l'application insère et met à jour datatables dans ces mêmes tables A,B,C

Est-il possible que l'application frontale s'exécute en parallèle sans problème pendant l'exécution du script SQL? J'ai vérifié les verrous sur la table et SQL Server acquiert des verrous de page. Peut Read Committed Snapshot niveaux d'isolement Read Committed Snapshot ou Snapshot Read Committed Snapshot ou de convertir des verrous de page en verrous de ligne ici. Besoin d'un conseil.

Diviser l'opération en deux phases. Dans la première phase, collectez les keys primaires des lignes à supprimer:

 create table #TempList (ID int); insert #TempList select ID from YourTable 

Dans la deuxième phase, utilisez une boucle pour supprimer ces lignes en petits groupes:

 while 1=1 begin delete top (1000) from YourTable where ID in (select ID from #TempList) if @@rowcount = 0 break end 

Les lots plus petits permettront à vos applications frontales de continuer entre elles.

Je soupçonne que SQL Server à un moment donné escalade au locking de table, et cela signifie que la table est inaccessible, à la fois pour la lecture et la mise à jour.

Pour optimiser le locking et la simultanéité lors de l'exécution de suppressions volumineuses, utilisez des lots. Commencez avec 5000 lignes à la fois (pour empêcher l'escalade du verrou) et surveillez son comportement et si vous avez besoin d'un réglage supplémentaire vers le haut ou vers le bas. 5000 est un "nombre magique", mais c'est un nombre assez bas que le gestionnaire de verrous ne considère pas l'escalade vers le verrou de table, et assez grand pour la performance.

Si les timeouts d'attente vont se produire ou non dépend d'autres facteurs, mais cela va sûrement réduire, sinon éliminer tout set. Si le timeout survient lors des opérations de lecture, vous devriez pouvoir vous en débarrasser. Une autre approche, bien sûr, consiste à augmenter la valeur du timeout d'expiration de la command sur le client.

Snapshot (optimistic) isolation est également une option, READ COMMITTED SNAPSHOT plus précisément READ COMMITTED SNAPSHOT , mais cela n'aidera pas avec les mises à jour d'autres sessions. Aussi, méfiez-vous de la croissance de la version store (dans tempdb). Mieux si vous combinez avec l'approche par lots proposée pour garder les transactions de petite taille.

En outre, passez à la récupération en bloc pour la durée de suppression si la database est en récupération complète normalement. Mais revenez dès qu'il se termine, et faites une sauvegarde.

Presque oublié – si c'est l'édition Enterprise de SQL Server, partitionnez votre table; alors vous pouvez simplement éteindre la partition, c'est presque momentané et les clients ne le remarqueront jamais.