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.
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. –
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. –
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? –