Il blocco di SQL Server è una caratteristica normale dei sistemi di database di SQL Server. Il blocco si verifica quando SQL Server gestisce le richieste di più client e processi diversi richiedono le stesse risorse contemporaneamente. Se una risorsa è in uso, è bloccata e non disponibile per le richieste successive, quindi il processo viene ritardato fino a quando la risorsa non viene rilasciata e diventa nuovamente disponibile. I blocchi di SQL Server normalmente si risolvono da soli senza un effetto evidente sulle prestazioni. Tuttavia, a volte, i blocchi causano un degrado delle prestazioni perché il processo iniziale blocca la risorsa per un periodo di tempo prolungato prima di rilasciarla o perché il processo iniziale non rilascia affatto la risorsa, il che rende le risorse inaccessibili fino a quando il blocco non viene risolto manualmente.
Quando un insieme di risorse viene bloccato per un periodo di tempo significativo, la qualità delle prestazioni diminuisce al punto che gli utenti del sistema iniziano a notare problemi. Questi problemi includono cose come query che richiedono molto tempo per l'esecuzione o timeout o che gli utenti non sono in grado di salvare le schermate che hanno modificato.
Come risolvere i blocchi di SQL Server
La soluzione a breve termine al blocco di SQL Server consiste nell'identificare e sbloccare manualmente la transazione quando si nota che uno o più blocchi hanno un impatto negativo sulle prestazioni.
Dopo aver confermato la presenza di un blocco di SQL Server, controllare il monitoraggio dell'attività di SQL Server e terminare le query che causano più problemi. È inoltre possibile utilizzare gli script SQL per monitorare continuamente lo stato di blocco e blocco in SQL Server. Brent Ozar suggerisce di aggiungere alcuni contatori delle prestazioni specifici del blocco in modo che SQL Server ti avviserà quando hai superato le soglie di blocco designate.
Come prevenire i blocchi di SQL Server
È utile per un amministratore di database sapere come correggere un blocco di SQL Server. Ma per il bene di mantenere un sistema ad alte prestazioni, è ancora meglio sapere come prevenire, o almeno minimizzare, il verificarsi di blocchi. Di seguito sono riportati quattro suggerimenti per ridurre al minimo alcuni tipi comuni di blocco di SQL Server:
1. Usa gli indici
L'utilizzo di indici cluster nelle tabelle ad alto utilizzo consente di ridurre il blocco richiedendo a Query Optimizer di eseguire una ricerca dell'indice anziché una scansione dell'indice. Quando solo il record in fase di aggiornamento è bloccato, i processi successivi possono aggirare il blocco e possono essere completati.
È anche importante assicurarsi che le istruzioni UPDATE e DELETE utilizzino gli indici. Gli indici aiutano le istruzioni UPDATE e DELETE a ridurre il numero di blocchi di modifica che acquisiscono utilizzando indici non cluster o suggerimenti di indice per rimuovere i blocchi.
2. Ripulisci le tue domande
Una procedura consigliata per evitare i blocchi di SQL Server è suddividere le transazioni lunghe in più transazioni più brevi. Le query di lunga durata mantengono un blocco per la durata della transazione, rendendo la risorsa non disponibile per altri processi. La suddivisione delle transazioni lunghe in quelle corte mantiene i dati in movimento.
Prendi in considerazione l'utilizzo dell'ottimizzazione di SQL Server per rendere le query il più efficienti possibile. Un buon Query Optimizer scriverà e riscriverà le query finché non saranno configurate per ridurre il numero di blocchi che possono rallentare le prestazioni.
3. Identificare la causa principale del blocco di SQL Server
Il monitoraggio delle metriche delle prestazioni nel tempo è un ottimo modo per evitare il blocco di SQL Server. Individuando quali sessioni sono bloccate frequentemente e quali istruzioni sono coinvolte, puoi determinare una linea d'azione per rimuovere le cause principali dei blocchi ricorrenti tramite l'indicizzazione, l'ottimizzazione delle query o altri mezzi.
Un altro posto in cui cercare la causa principale del blocco è il carico di lavoro del sistema. Eseguire un'analisi del carico di lavoro per determinare se si è verificato un aumento. Un carico di lavoro troppo pesante causerà il blocco di SQL Server poiché il numero crescente di query si accumula in attesa dell'accesso alle risorse bloccate. Potrebbe essere necessario aggiungere indici o distribuire il carico di lavoro su più database per risolvere i problemi di prestazioni dei carichi di lavoro pesanti.
4. Tieni aggiornate le tue statistiche
Statistiche obsolete possono attivare l'esecuzione di piani di query inefficienti perché il piano non è stato aggiornato per tenere conto delle modifiche. SQL Server avvierà le ricerche per indicizzazione per cercare i dati spostati o mancanti, che a loro volta creeranno blocchi.
Il modo più efficace per mantenere aggiornate le statistiche è automatizzare il maggior numero possibile di aggiornamenti. Se non sei in grado di pianificare gli aggiornamenti automatici, assicurati di aggiungere gli aggiornamenti manuali all'elenco di controllo della manutenzione programmata per assicurarti che gli aggiornamenti vengano eseguiti regolarmente.
Il blocco di SQL Server può essere un dato di fatto della vita del DBA, ma ci sono modi per mitigarne l'impatto sulle prestazioni del database di SQL Server. Interrompi il ciclo blocco-sblocco implementando alcune delle strategie discusse sopra. Con un po' di pianificazione, ottimizzazione e automazione, è possibile ridurre il verificarsi del blocco di SQL Server e, in alcune circostanze, eliminarlo del tutto.