Controlla le sessioni bloccate per un'istanza di SQL. Nota: per impostazione predefinita, questo monitoraggio è disabilitato. Usare gli override per abilitarlo quando necessario.
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
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 massimo consentito 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.2016.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.2016.DBEngine.BlockedSPIDs | ||
Remotable | True | ||
Accessibility | Public | ||
Alert Message |
| ||
RunAs | Default |
<UnitMonitor ID="Microsoft.SQLServer.2016.DBEngine.BlockedSPIDsMonitor" Accessibility="Public" Enabled="false" Target="SQL2016Core!Microsoft.SQLServer.2016.DBEngine" ParentMonitorID="SystemHealth!System.Health.PerformanceState" Remotable="true" Priority="Normal" TypeID="Microsoft.SQLServer.2016.DBEngine.BlockedSPIDs" ConfirmDelivery="false">
<Category>PerformanceHealth</Category>
<AlertSettings AlertMessage="Microsoft.SQLServer.2016.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="SQL2016Core!Microsoft.SQLServer.2016.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="SQL2016Core!Microsoft.SQLServer.2016.DBEngine"]/ConnectionString$</ConnectionString>
<IntervalSeconds>300</IntervalSeconds>
<SyncTime/>
<WaitMinutes>1</WaitMinutes>
<NumberBlockedSPIDs>1</NumberBlockedSPIDs>
<TimeoutSeconds>300</TimeoutSeconds>
<InstanceName>$Target/Property[Type="SQL2016Core!Microsoft.SQLServer.2016.ServerRole"]/InstanceName$</InstanceName>
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
</Configuration>
</UnitMonitor>