Surveille les sessions bloquées d'une instance SQL.
L'analyse des sessions de blocage détecte les situations de blocage.
Un blocage se produit quand une session détient un verrou sur une ressource spécifique et qu'une autre session tente d'acquérir un type de verrou en conflit sur la même ressource. Le blocage est une caractéristique inévitable de tout système de gestion de base de données relationnelle (SGBDR) avec concurrence basée sur les verrous. Un trop grand nombre de blocages peut cependant provoquer des problèmes de performances.
Quand le verrouillage et le blocage prennent une ampleur telle que les performances du système sont considérablement affectées, la raison en est généralement une des suivantes :
Une session détient un verrou sur un ensemble de ressources et ne les libère jamais. Ceci est généralement dû aux raisons suivantes :
des requêtes annulées qui ne sont pas restaurées ;
des transactions orphelines.
Une session (identifiée par un session_id ou « SPID ») détient un verrou sur un ensemble de ressources pendant une période de temps étendue avant de les libérer. La raison en est généralement une des suivantes :
des transactions de longue durée ;
un manque d'index appropriés ;
une utilisation inappropriée d'indicateurs de blocage ;
d'autres problèmes ayant trait à la mauvaise conception d'une application.
Terminer la session à la tête de la chaîne des blocages
Raccourcir les durées des transactions
Créer des index appropriés
Utiliser des indicateurs de verrouillage. Consultez la documentation en ligne de SQL Server
Utiliser des niveaux d'isolement basés sur les versions des lignes
Configurer les paramètres SQL Server (paramètres de mémoire, dépassements de délai d'expiration des verrous, etc.)
Changer les seuils sur le moniteur pour cette base de données spécifique ou pour toutes les bases de données
Si des sessions bloquées ne sont pas un problème pour la base de données, vous pouvez aussi :
Désactiver le moniteur pour cette base de données spécifique ou pour toutes les bases de données
Voir aussi : « INF : Présentation et résolution des problèmes de blocage de SQL Server »
Nom | Description | Valeur par défaut |
Priorité de l'alerte | Définit la priorité de l'alerte. | Élevé |
Gravité de l'alerte | Définit la gravité de l'alerte. | Erreur |
Activé | Active ou désactive le flux de travail. | Non |
Génère des alertes | Définit si le flux de travail génère une alerte. | Oui |
Intervalle (en secondes) | L'intervalle de temps récurrent en secondes pendant lequel le workflow est exécuté. | 300 |
Nombre de sessions bloquées | Nombre de sessions bloquées. | 1 |
Heure de synchronisation | L'heure de synchronisation spécifiée dans un format de 24 heures. Peut être omise. |
|
Délai d'expiration (en secondes) | Spécifie la durée pendant laquelle le workflow est autorisé à être exécuté avant d'être fermé et marqué comme un échec. | 300 |
Délai d'attente (minutes) | Durée d'exécution minimale du processus avant sa prise en compte pour une analyse des SPID bloqués. | 1 |
Target | Microsoft.SQLServer.2008.DBEngine | ||
Parent Monitor | System.Health.PerformanceState | ||
Category | PerformanceHealth | ||
Enabled | False | ||
Alert Generate | True | ||
Alert Severity | Error | ||
Alert Priority | High | ||
Alert Auto Resolve | True | ||
Monitor Type | Microsoft.SQLServer.2008.DBEngine.BlockedSPIDs | ||
Remotable | True | ||
Accessibility | Public | ||
Alert Message |
| ||
RunAs | Default |
<UnitMonitor ID="Microsoft.SQLServer.2008.DBEngine.BlockedSPIDsMonitor" Accessibility="Public" Enabled="false" Target="SQL2008Core!Microsoft.SQLServer.2008.DBEngine" ParentMonitorID="SystemHealth!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2008.DBEngine.BlockedSPIDs" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2008.DBEngine.BlockedSPIDsMonitor.AlertMessage">
<AlertOnState>Error</AlertOnState>
<AutoResolve>true</AutoResolve>
<AlertPriority>High</AlertPriority>
<AlertSeverity>Error</AlertSeverity>
<AlertParameters>
<AlertParameter1>$Data/Context/Property[@Name='BlockedSPIDList']$</AlertParameter1>
<AlertParameter2>$Target/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</AlertParameter2>
<AlertParameter3>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</AlertParameter3>
</AlertParameters>
</AlertSettings>
<OperationalStates>
<OperationalState ID="Blocked" MonitorTypeStateID="Blocked" HealthState="Error"/>
<OperationalState ID="NotBlocked" MonitorTypeStateID="NotBlocked" HealthState="Success"/>
</OperationalStates>
<Configuration>
<ConnectionString>$Target/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/ConnectionString$</ConnectionString>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<WaitMinutes>1</WaitMinutes>
<NumberBlockedSPIDs>1</NumberBlockedSPIDs>
<TimeoutSeconds>300</TimeoutSeconds>
<InstanceName>$Target/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$</InstanceName>
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
</Configuration>
</UnitMonitor>