2015-03-11 2 views
0

Mon application exécute un processus de purge nocturne pour supprimer les anciens enregistrements des tables principales de mon application OLTP. Je connaissais l'escalade de verrouillage pendant le processus de purge qui bloquait les insertions simultanées dans la table, donc j'ai modifié la procédure de purge pour boucler et supprimer les enregistrements dans des blocs de 4900 qui devraient être bien inférieurs au seuil d'escalade de 5000 de SQL Server. a été très réduite, Profiler SQL Server signale encore l'escalade de verrouillage occasionnelle sur l'instruction DELETE suivante dans la boucle:Escalade de verrouillage SQL Server

-- outer loop increments @BatchMinId and @BatchMaxId variables 
    BEGIN TRAN 

    -- limit is set at 4900 
    DELETE TOP (@limit) h 
    OUTPUT DELETED.ChildTable1Id, 
     DELETED.ChildTable2Id, 
     DELETED.ChildTable3Id, 
     DELETED.ChildTable4Id 
    INTO #ChildRecordsToDelete 
    FROM MainTable h WITH (ROWLOCK) 
    WHERE h.Id >= @BatchMinId AND h.Id <= @BatchMaxId AND h.Id < @MaxId AND 
     NOT EXISTS (SELECT 1 FROM OtherTable ot WHERE ot.Id = h.Id); 

    -- delete from ChildTables 1-4 (no additional references to MainTable) 
    COMMIT TRAN; 
-- end loop 

la colonne « IntegerData2 » dans SQL Server Profiler pour les événements d'escalade de verrous signalés (qui est censé être le escalated lock count) est compris entre 10197 et 10222, ce qui ne ressemble à aucun multiple de 4900 (ma taille de lot de purge) plus aucun multiple de 1250 (number of additional locks SQL Server may take before attempting escalation). Étant donné que je limite explicitement l'instruction DELETE à 4900 lignes, comment est-ce que plus de verrous sont jamais pris, en particulier au point que SQL Server est en train d'escalader un verrou de table? Je voudrais comprendre cela avant de recourir à la désactivation de l'escalade des verrous sur cette table.

+1

Je ne désactiverais pas l'escalade de verrous - cela peut entraîner d'autres problèmes. Pour une discussion très claire sur la désactivation de l'escalade des verrous, veuillez consulter http://www.sqlpassion.at/archive/2014/02/25/lock-escalations/ Que pensez-vous de la purge par lots de 1000? Dans mon expérience, vous ne verrez pas de grandes différences de vitesse. –

+1

Je pense que malgré tous vos efforts, SQL Server peut décider d'escalader les verrous quand il le souhaite. Y a-t-il des exigences de rapidité pour la suppression? Logiquement, plus la taille du lot est petite, moins vous aurez d'escalade de verrous. Pourrait-il être réduit encore plus loin? En outre, la requête peut-elle être réglée de toute façon? Cela peut réduire la probabilité d'escalade de verrous. –

+1

Je ne suis pas vraiment un expert en la matière, mais si vous avez des index non clusterisés, je suppose que ceux-ci doivent également être verrouillés et supprimés + peut-être aussi quelques pages dans un index clusterisé. Cela pourrait-il expliquer cela? –

Répondre

0

Je ne peux pas commenter votre question car je n'ai pas assez de réputation sur ce site web, donc je commente ici.

J'ai eu un problème similaire avec une tâche de nettoyage s'exécutant la nuit. L'instruction delete a été verrouillée par le "GHOST CLEANUP". Voici un coup d'oeil à ceci: SQL Server Lock Timeout Exceeded Deleting Records in a Loop

Espérons que cette aide. Une solution étrange que j'ai trouvé à l'époque était: 1) Insérer l'enregistrement à conserver dans une autre table avec la même structure. (Copier) 2) Tronquer la table à nettoyer 3) Insérer les données en arrière pour conserver de la copie dans la table maintenant vide. 4) Tronquer la table de copie pour libérer de l'espace.

Cette astuce a été plus rapide à nettoyer que la suppression elle-même, car la suppression a été effectuée en une fraction de seconde à cause de tronquer. D'une certaine manière, le coût d'insertion était moins cher que la suppression.

Mais encore, je recommanderais d'éviter cette solution. Vous pouvez également réduire le tronçon entre 100 et 500. Cette durée augmente le temps de nettoyage, mais vous risquez moins d'avoir l'escalade de verrous.