Estoy tratando de solucionar un problema de bloqueo que ocurre por menos de un segundo. La aplicación OLTP es muy sensible y debe tener un tiempo de respuesta de menos de 200 ms para algunas transacciones según el acuerdo de nivel de servicio acordado. Tuvimos algunos problemas de escalada de bloqueo con la nueva versión del código que pudimos resolver reduciendo el tamaño del lote en las actualizaciones. Incluso con el pequeño tamaño de lote, sospechamos que el nuevo sp está bloqueando las mismas filas que las transacciones OLTP están actualizando.
Necesito encontrar la sesión que se está bloqueando y el recurso está esperando. Según mi entendimiento, el "umbral de proceso bloqueado" puede establecerse por un mínimo de 1 segundo, por lo que esto no capturará el bloqueo.
Estoy experimentando con wait_info y wait_completed x eventos.
¿Hay alguna otra forma de rastrear esto? Gracias
Respuestas:
Como está específicamente interesado en bloquear en lugar de esperar en general, el
locks_lock_waits
evento extendido suena más adecuado.Con un filtro encendido
increment >= 200
Lo anterior reúne las declaraciones que esperan en los bloqueos durante el umbral de tiempo, pero no proporciona el recurso de bloqueo específico.
Nunca he usado este evento y no tengo idea de cuánto sobrecargaría esta sesión en su servidor de producción.
Encontré este video sobre el tema. Eso recomienda encarecidamente filtrar
counter
para reducir la cantidad de eventos recopilados y lo he hecho anteriormente.También menciona un antiguo comando indocumentado heredado
Que (si el indicador de seguimiento 3605 está habilitado) volca información limitada, como la siguiente, en el registro de errores de SQL Server.
Solo menciono esto de pasada, ya que los eventos extendidos serían claramente preferibles de todos modos, ya que está documentado y es mucho más poderoso.
fuente
dbcc lock(StallReportThreshold, 200)
primero y genera la información una vez que se supera el umbral, siempre que el indicador de seguimiento 3605 esté habilitado. SQL Server no recopila esta información en caso de que pueda ejecutarla más tarde.Si está interesado en bloquear, hay varios eventos extendidos disponibles:
Los primeros dos eventos tienen una
duration
columna en (microsegundos) que puede filtrar para sus umbrales. También tienen unaresource_description
acción que le dará algunos detalles sobre los recursos involucrados.El
lock_escalation
evento también tiene unastatement
acción que puede agregar para recopilar la instrucción T-SQL que desencadenó la escalada de bloqueo. También tieneescalation_cause
. Aquí hay una sesión de muestra:Sospecho que probablemente haya una razón por la que no puede establecer el umbral del informe de proceso bloqueado en menos de un segundo: el bloqueo es perfectamente normal en un RDBMS: el motor de la base de datos debe bloquear los recursos para protegerlos. Aunque no existe una definición oficial de cuándo el bloqueo se convierte en bloqueo, el bloqueo del tic-tac en menos de un segundo me parece algo normal.
fuente