Risolvere i problemi relativi al blocco delle query in Fabric Data Warehouse

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.

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.objects per identificare il resource_associated_entity_id in cui il resource_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 valore DMS_user indica 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_time notevolmente precedente all'ora corrente, che indica una richiesta aperta da molto tempo.
  • Cerca un total_elapsed_time che 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 è sleeping e open_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_requests e total_elapsed_time continua 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) o Sch-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 TRANSACTION senza un corrispondente COMMIT o ROLLBACK).
  • Mantenere le transazioni di breve durata. Eseguire solo le operazioni necessarie all'interno della transazione.
  • Sempre COMMIT o ROLLBACK le 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.