Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
si applica a:✅ Magazzino di dati in Microsoft Fabric
Se le query in Warehouse richiedono insolitamente molto tempo o sembrano bloccate, una possibile causa è il blocco. Il blocco si verifica quando una sessione contiene un blocco che impedisce l'esecuzione di altre query.
Questo articolo illustra come determinare se il blocco influisce sul carico di lavoro e sulle azioni che è possibile eseguire.
Tip
Warehouse usa il blocco a livello di tabella. Qualsiasi operazione DML acquisisce un blocco sull'intera tabella, indipendentemente dal numero di righe interessate. Questo comportamento è diverso da SQL Server, che supporta blocchi a livello di riga e a livello di pagina.
Prerequisiti
- Un warehouse con carichi di lavoro attivi.
- L'appartenenza al ruolo Visualizzatore dell'area di lavoro è il livello minimo di autorizzazione per interrogare le viste di gestione dinamica (DMV) descritte in questo articolo.
- Per altre informazioni sulla risoluzione dei problemi relativi alle DMV, vedere Monitorare connessioni, sessioni e richieste tramite DMV.
Passaggio 1: Verificare se le query sono in attesa di blocchi
Per iniziare, verificare se le query sono attualmente in attesa di blocchi.
Eseguire la query riportata di seguito:
SELECT
request_session_id,
resource_type,
resource_description,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE request_status = 'WAIT';
Se la query restituisce righe, alcune sessioni sono in attesa di risorse detenute da altre sessioni. Ogni riga indica una richiesta di blocco che attualmente non può essere concessa.
Tip
La vista sys.dm_tran_locks può restituire un gran numero di righe per i blocchi già concessi. Il filtro per request_status = 'WAIT' si concentra sulle sessioni bloccate.
Passaggio 2: Identificare le query bloccate
Verificare quindi quali query sono bloccate e quale sessione li blocca.
SELECT
session_id,
status,
blocking_session_id,
wait_type,
total_elapsed_time,
open_transaction_count
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
Questa query restituisce:
- Sessione che esegue la query bloccata (
session_id) - La sessione attualmente la blocca (
blocking_session_id) - Da quanto tempo è in attesa (
total_elapsed_time, in millisecondi) - Indica se la sessione di blocco ha una transazione aperta (
open_transaction_count)
Se una query mostra blocking_session_id che è diverso da zero e open_transaction_count > 0, è in attesa di un'altra sessione che mantiene un blocco.
Passaggio 3: Trovare la sessione di blocco
Per capire quale risorsa è bloccata, esaminare i blocchi attualmente detenuti dalla sessione bloccante. Sostituire il <blocking_session_id> nella query di esempio seguente con il session_id identificato in precedenza:
SELECT
request_session_id,
resource_type,
resource_associated_entity_id,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE
request_status = 'GRANT'
AND request_session_id = <blocking_session_id>;
Usa questa query per determinare:
- Le risorse su cui la sessione bloccante detiene attualmente blocchi. Ad esempio, è possibile utilizzare
sys.objectsper identificare ilresource_associated_entity_idin cui ilresource_type = OBJECT. - Modalità di blocco (ad esempio, Exclusive (
X), Schema-Modification (Sch-M)) - Indica se il blocco è correlato a un'operazione DDL o a un aggiornamento delle statistiche (
UPDSTATS)
Note
Anche i blocchi correlati alle statistiche ( ad esempio quelli di UPDSTATS) vengono visualizzati in sys.dm_tran_locks. Schema-Modification (Sch-M) e i blocchi esclusivi (X) sono i blocchi più comuni, ma qualsiasi tipo di blocco può bloccare una richiesta in conflitto (ad esempio, Sch-S blocchi Sch-M).
Passaggio 4: Trovare il proprietario della transazione di blocco
In molti casi, potrebbe essere preferibile chiedere al proprietario della transazione bloccante di COMMIT o ROLLBACK il proprio lavoro invece di terminare la sessione. Valutare l'uso delle strutture TRYCATCH per la gestione degli errori con COMMIT o ROLLBACK. Per altre informazioni, vedere TRY... CATCH.
È possibile identificare il proprietario e la query associata alla sessione bloccante. Sostituisci session_id che hai identificato in precedenza al posto di <blocking_session_id> nella seguente query di esempio:
SELECT
r.session_id,
s.login_name,
s.program_name,
r.status,
r.blocking_session_id,
r.command,
r.total_elapsed_time,
s.last_request_start_time,
s.last_request_end_time
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s
ON r.session_id = s.session_id
WHERE r.session_id = <blocking_session_id>;
-
login_nameè il proprietario della sessione di blocco. -
program_nameè l'applicazione che ha avviato la sessione. Il valoreDMS_userindica l'editor di query del portale Fabric. -
commandè il comando attualmente in esecuzione.
È quindi possibile contattare il proprietario della transazione per eseguire il commit o il rollback, se appropriato.
Passaggio 5: Verificare se la sessione di blocco è inattiva o meno in corso
Una sessione di blocco potrebbe apparire attiva, ma non sta effettivamente effettuando progressi.
Gli indicatori di una sessione inattiva o bloccata includono:
-
status = 'sleeping'indica che non è in esecuzione alcuna query attiva. - Cercate un
last_request_start_timenotevolmente precedente all'ora corrente, che indica una richiesta aperta da molto tempo. - Cerca un
total_elapsed_timeche non aumenta tra un controllo e l'altro, a indicare una sessione bloccata.
SELECT
session_id,
status,
last_request_start_time,
last_request_end_time,
open_transaction_count
FROM sys.dm_exec_sessions
WHERE session_id = <blocking_session_id>;
- Se lo stato della sessione è
sleepingeopen_transaction_count > 0, la sessione ha una transazione aperta senza query attiva, ma mantiene un blocco senza eseguire operazioni. - Se la sessione compare in
sys.dm_exec_requestsetotal_elapsed_timecontinua ad aumentare tra una verifica e l'altra, la sessione è in corso. Potrebbe essere preferibile attendere il completamento della transazione anziché terminarla e forzare un rollback.
Passaggio 6: Eseguire un'azione per risolvere il blocco
Note
Le situazioni di blocco spesso si risolvono autonomamente dopo che la sessione di blocco completa la transazione. Se il carico di lavoro può tollerare il ritardo, l'attesa è l'opzione più sicura.
Se è necessario sbloccare le query downstream, valutare se una sessione di blocco presenta le caratteristiche seguenti:
- Dispone di una transazione aperta
- Sembra inattivo o non avanza
- Mantiene un lock bloccante (ad esempio, Esclusivo (
X) oSch-M)
In tal caso, un membro del ruolo dell'area di lavoro Amministratore può terminare una sessione usando:
KILL <session_id>;
Il comando KILL:
- Terminare la sessione
- Annullare tutto il lavoro svolto nella transazione attiva di quella sessione
- Rilasciare il blocco
- Consentire alle query successive di procedere
Caution
La terminazione di una sessione provoca il rollback di tutto il lavoro non sottoposto a commit eseguito da tale sessione. Questa azione potrebbe annullare le modifiche apportate ai dati dall'utente o dall'applicazione. Usare questa opzione solo quando si è certi che la terminazione della transazione non influisce negativamente sul carico di lavoro.
Passaggio 7: Prevenire i problemi di blocco futuri
Per evitare problemi simili:
- Evitare di lasciare aperte transazioni esplicite (
BEGIN TRANSACTIONsenza un corrispondenteCOMMIToROLLBACK). - Mantenere le transazioni di breve durata. Eseguire solo le operazioni necessarie all'interno della transazione.
- Sempre
COMMIToROLLBACKle transazioni una volta completate. - Pianificare le operazioni DDL (ad esempio
ALTER TABLE) durante le finestre con traffico ridotto.
Monitorare in modo proattivo le transazioni aperte usando:
SELECT
session_id,
login_name,
open_transaction_count,
program_name,
status,
blocking_session_id,
last_request_start_time
FROM sys.dm_exec_sessions
WHERE open_transaction_count > 0;
Monitorare regolarmente le transazioni aperte e intervenire quando appropriato consente di ridurre la probabilità che le catene di blocco si formino.