SQL Server LCK_M_S se produit uniquement en production

J'ai une procédure stockée qui est appelée par un rapport SQL Server 2012 qui prend un âge d'exécution en production par rapport au développement en raison d'une session de blocage lck_m_s

La procédure stockée s'exécute instantanément lorsqu'elle est exécutée dans SQL Server Management Studio et fonctionne également bien lorsqu'elle est appelée dans le cadre d'un rapport d'un ordinateur portable dev via Visual Studio.

Lorsque le rapport est téléchargé sur le server de production, ce problème de blocage apparaît.

Comment puis-je savoir ce qui cause le problème de lck_m_s en production?

Exécutez cette requête lorsque le problème se reproduit:

 select * from sys.dm_os_waiting_tasks t inner join sys.dm_exec_connections c on c.session_id = t.blocking_session_id cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) as h1 

Il vous donnera le spid de la session qui a provoqué le blocage, sur quelle ressource a été bloquée, et le text de la requête la plus récente pour cette session. Cela devrait vous donner un bon sharepoint départ.

vous avez plusieurs options

  1. Configurez le rapport de process bloqué. Pour l'essentiel, vous définissez la configuration système du blocked process threshold (s) sur un nombre de secondes différent de zéro et définissez une notification d'événement sur l'événement BLOCKED_PROCESS_REPORT . Vous obtiendrez un rapport XML chaque fois qu'un process est bloqué pour plus que le seuil que vous avez défini. L'inconvénient de ceci est que ce sera pour tout ce qui se bloque, pas seulement pour votre procédure, mais vous obtiendrez celui qui détient le verrou non compatible dans le rapport.

  2. Configurez une session d'events étendue pour votre procédure afin de capturer l'événement lock_released dont la durée est supérieure à celle que vous souhaitez attendre. L'avantage est que cela est extrêmement ciblé et vous pouvez définir la session de sorte que vous obtenez très peu de bruit. L'inconvénient est que vous ne saurez pas quel process contient le verrou incompatible (bien que vous obtiendrez une description assez détaillée de ce qu'est la ressource verrouillée pour poursuivre votre enquête).