Examiner KEYLOCKs dans SQL Server 2005

J'ai essayé de résoudre différents blocages que nous voyons dans la production. Nous avons activé le suivi des interblocages. Les traces montrent beaucoup de blocage sur KEYLOCKs comme ceci:

01/15/2010 08:25:07,spid15s,Unknown,keylock hobtid=72057594047758336 dbid=2 objectname=tempdb.dbo.MyTable indexname=IX_MyTable id=lock36977900 mode=X associatedObjectId=72057594047758336 

D'après ce que je comprends, le keylock verrouille l'index pour empêcher l'insertion, la mise à jour ou la suppression des loggings pendant que la transaction effectue ses propres insertions, mises à jour et suppressions.

Je suppose qu'il y a de mauvais plans de requête provoquant de mauvais verrous à requestr. Je peux exécuter les mêmes requêtes sur mon système de développement et exécuter sp_lock pour examiner les verrous requirejs par la requête, et je vois quelques KEYLOCKs dans la list. Comment examine-t-on la gamme de keys que le KEYLOCK bloquait?

Pour les verrous KEY , la valeur de la resource dans sp_lock est une valeur hachée de la key en cours de locking.

Les 2 premiers octets sont les 2 octets inférieurs de la valeur de key, les autres octets sont le hash ou la valeur.

Utilisez cette requête pour find les lignes en cours de locking:

 SELECT * FROM mytable WHERE %%LOCKRES%% = '{0000ABCDEFAB}' 

, où la string est la valeur de la ressource verrouillée de sp_lock .

Si cette requête returnne deux lignes alors vous avez rencontré une collision de hachage qui est assez improbable mais possible, avec une probabilité croissante à mesure que la taille de la table augmente (en raison du paradoxe de l'anniversaire).

Ce lien explique prétendument comment le faire. C'est un peu long, donc je ne vais pas le couper et le coller ici, mais quand j'aurai l'occasion de le tester et de le réduire, je postrai un aperçu afin qu'il soit sauvegardé pour toujours.

Message du forum sur la découverte de la ligne verrouillée