J'essaie de résoudre un problème de blocage qui se produit pendant moins d'une seconde. L'application OLTP est très sensible et doit avoir un temps de réponse inférieur à 200 ms pour certaines transactions conformément au SLA convenu. Nous avons eu quelques problèmes d'escalade de verrous avec la nouvelle version du code que nous avons pu résoudre en réduisant la taille du lot dans les mises à jour. Même avec la petite taille du lot, nous pensons que le nouveau sp bloque les mêmes lignes que les transactions OLTP sont en train de mettre à jour.
J'ai besoin de trouver la session bloquée et la ressource en attente. Selon ma compréhension, le «seuil de processus bloqué» peut être défini pour un minimum de 1 seconde et donc cela ne capturera pas le blocage.
J'expérimente avec wait_info et wait_completed x événements.
Existe-t-il un autre moyen de suivre cela. Merci
Réponses:
Comme vous êtes spécifiquement intéressé par le verrouillage plutôt que par l'attente générale, l'
locks_lock_waits
événement étendu semble plus approprié.Avec un filtre sur
increment >= 200
Ce qui précède rassemble les instructions en attente sur les verrous pendant la durée seuil, mais ne donne pas la ressource de verrouillage spécifique.
Je n'ai jamais utilisé cet événement et je n'ai aucune idée de la surcharge que cette session entraînerait sur votre serveur de production.
J'ai trouvé cette vidéo sur le sujet. Cela recommande fortement le filtrage
counter
pour réduire le nombre d'événements collectés et je l'ai fait ci-dessus.Il mentionne également une ancienne commande non documentée héritée
Lequel (si l'indicateur de trace 3605 est activé) vide les informations limitées telles que celles ci-dessous dans le journal des erreurs SQL Server.
Je mentionne juste ceci en passant car des événements prolongés seraient de toute façon clairement préférables car ils sont documentés et beaucoup plus puissants.
la source
dbcc lock(StallReportThreshold, 200)
premier et il génère les informations une fois le seuil dépassé tant que l'indicateur de trace 3605 est activé. SQL Server ne collecte pas ces informations au cas où vous pourriez les exécuter plus tard.Si vous êtes intéressé par le verrouillage, plusieurs événements étendus sont disponibles:
Les deux premiers événements ont une
duration
colonne en (microsecondes) sur laquelle vous pouvez filtrer pour vos seuils. Ils ont également uneresource_description
action qui vous donnera quelques détails sur les ressources impliquées.L'
lock_escalation
événement a également unestatement
action que vous pouvez ajouter pour collecter l'instruction T-SQL qui a déclenché l'escalade du verrouillage. Il l'a également faitescalation_cause
. Voici un exemple de session:Je soupçonne qu'il y a probablement une raison pour laquelle vous ne pouvez pas définir le seuil de rapport de processus bloqué à moins d'une seconde: le verrouillage est parfaitement normal dans un SGBDR - le moteur de base de données doit verrouiller les ressources afin de les protéger. Bien qu'il n'y ait pas de définition officielle quant au moment où le verrouillage devient bloquant, le verrouillage du ticking en moins d'une seconde me semble un peu normal.
la source