Controlla le sessioni bloccate per un'istanza di SQL Server.
Il monitoraggio del blocco sessioni rileva un'eventuale situazione di blocco.
Il blocco si verifica quando una sessione mantiene un blocco su una risorsa specifica e una seconda sessione tenta di acquisire un tipo di blocco in conflitto sulla stessa risorsa. Il blocco è una caratteristica inevitabile di qualsiasi sistema di gestione di database relazionali (RDBMS, Relational Database Management System) con concorrenza basata sul blocco. Un numero troppo elevato di blocchi può tuttavia causare problemi di prestazioni.
Se il numero di blocchi raggiunge un livello che determina un impatto notevole sulle prestazioni del sistema, il problema è in genere causato da uno dei motivi seguenti:
Una sessione mantiene blocchi su un set di risorse per un periodo di tempo prolungato senza mai rilasciarli. Motivi più frequenti:
Query annullate di cui non viene eseguito il rollback
Transazioni orfane
Una sessione (identificata da un ID di sessione o da un "SPID") mantiene blocchi su un set di risorse per un periodo di tempo prolungato prima di rilasciarlo. Motivi più frequenti:
Transazioni con esecuzione prolungata
Mancanza di indici appropriati
Utilizzo inappropriato di hint di blocco
Altri problemi correlati alla progettazione dell'applicazione
Terminare la sessione in corrispondenza dell'inizio della catena di blocco
Abbreviare i tempi delle transazioni
Creare indici appropriati
Utilizzare hint di blocco. Vedere la documentazione online di SQL Server
Utilizzare un livello di isolamento basato sul controllo delle versioni delle righe
Configurare le impostazioni di SQL Server (impostazioni della memoria, timeout di blocco e così via)
Modificare le soglie del monitoraggio di questo specifico database o di tutti i database
In alternativa, se le sessioni bloccate non rappresentano un problema, effettuare l'operazione seguente:
Disabilitare il monitoraggio per questo specifico database o per tutti i database
Vedere anche: “ INF: Comprensione e risoluzione dei problemi di blocco di SQL Server”
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>