Esegue il monitoraggio delle sessioni bloccate per un'istanza SQL.
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 un'altra sessione prova ad 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 in genere mantiene i blocchi su un set di risorse senza mai rilasciarli per i motivi seguenti:
Query annullate di cui non viene eseguito il rollback
Transazioni orfane
Una sessione (identificata da un ID sessione o da un "SPID") in genere mantiene i blocchi su un set di risorse per un periodo di tempo prolungato prima di rilasciarli per i motivi seguenti:
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
Usare hint di blocco. Vedere la documentazione online di SQL Server.
Usare livelli di isolamento basati 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 per il database specifico o per tutti i database
In alternativa, se le sessioni bloccate non rappresentano un problema, procedere come segue:
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"
Nome | Descrizione | Valore predefinito |
Priorità avviso | Definisce la priorità dell'avviso. | Alto |
Gravità avviso | Definisce la gravità dell'avviso. | Errore |
Abilitato | Abilita o disabilita il flusso di lavoro. | No |
Genera avvisi | Definisce se il flusso di lavoro genera un avviso. | Sì |
Intervallo (secondi) | Intervallo di tempo ricorrente in secondi in cui eseguire il flusso di lavoro. | 300 |
Numero di sessioni bloccate | Numero di sessioni bloccate. | 1 |
Ora di sincronizzazione | Ora di sincronizzazione specificata usando il formato a 24 ore. Può essere omessa. |
|
Timeout (secondi) | Specifica il tempo di esecuzione consentito per il flusso di lavoro prima che venga chiuso e contrassegnato come non riuscito. | 300 |
Tempo di attesa (minuti) | Durata di esecuzione del processo minima prima che venga considerato per l'analisi degli SPID bloccati. | 1 |
Target | Microsoft.SQLServer.2012.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.2012.DBEngine.BlockedSPIDs | ||
Remotable | True | ||
Accessibility | Public | ||
Alert Message |
| ||
RunAs | Default |
<UnitMonitor ID="Microsoft.SQLServer.2012.DBEngine.BlockedSPIDsMonitor" Accessibility="Public" Enabled="false" Target="SQL2012Core!Microsoft.SQLServer.2012.DBEngine" ParentMonitorID="SystemHealth!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2012.DBEngine.BlockedSPIDs" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2012.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>