Condividi tramite


Risolvere i problemi relativi a TempDB in un pool SQL dedicato

Si applica a: Azure Synapse Analytics

In un pool SQL dedicato, il database tempdb viene usato per le tabelle temporanee e lo spazio intermedio per gli spostamenti dei dati (ad esempio, spostamenti casuali, spostamenti di taglio), ordina, carichi, perdite di memoria e altre operazioni. Inoltre, una transazione di cui non è stato eseguito il commit in una sessione che interagisce con il database tempdb impedirà al log di scaricare tutte le altre sessioni, causando il riempimento dei file di log. Poiché il database tempdb è una risorsa condivisa, un utilizzo elevato dello spazio tempdb può causare l'esito negativo delle query di altri utenti e può eseguire l'escalation per impedire la creazione di nuove connessioni.

Cosa fare se non è possibile connettersi al pool SQL dedicato?

Se non sono presenti connessioni per identificare connessioni o query problematiche, l'unico metodo per risolvere l'impossibilità di creare una nuova connessione consiste nel sospendere e riprendere oppure ridimensionare il pool SQL dedicato. Questa azione terminerà le transazioni utente che hanno causato questo problema e ricreano il database tempdb al riavvio del servizio.

Nota: assicurarsi di concedere al servizio tempo aggiuntivo per annullare tutte le transazioni in esecuzione perché le operazioni di sospensione e scalabilità potrebbero richiedere più tempo del normale per il completamento in questo scenario.

Risolvere i problemi relativi ai file di dati tempdb completi

Passaggio 1: Identificare la query che riempie il database tempdb

Assicurarsi di identificare la query che riempie il database tempdb durante l'esecuzione della query, a meno che non sia stato implementato un componente di registrazione nel framework ETL o il controllo delle istruzioni del pool SQL dedicato. Nella maggior parte dei casi, non sempre, la query con esecuzione più lunga eseguita durante l'intervallo di tempo in cui si è verificato il problema è la causa degli errori di spazio insufficiente di tempdb. Eseguire la query seguente per ottenere un elenco di query con esecuzione prolungata:

SELECT TOP 5 *
FROM sys.dm_pdw_exec_requests
WHERE status = 'running'
ORDER BY total_elapsed_time desc;

Dopo aver ottenuto una query ragionevolmente sospetta, provare una delle opzioni seguenti:

  • Terminare l'istruzione .
  • Tentare di impedire a qualsiasi altro carico di lavoro di utilizzare ulteriormente lo spazio tempdb in modo che il long-runner possa essere completato.

Passaggio 2: Impedire la ricorrenza

Dopo aver identificato ed eseguito un'azione sulla query responsabile, prendere in considerazione l'implementazione delle mitigazioni per evitare che il problema venga ricorrente. La tabella seguente illustra le mitigazioni per le cause più comuni degli errori completi di tempdb:

Causa Descrizione Strategia di riduzione del rischio
Piano distribuito in modo non adeguato Il piano distribuito generato per una determinata query può introdurre inavvertitamente lo spostamento dei dati ad alta frequenza a causa di statistiche di tabella gestite in modo non adeguato. Aggiornare le statistiche per le tabelle pertinenti e assicurarsi che vengano mantenute in base a una pianificazione regolare.
Scarsa integrità dell'indice columnstore cluster Usa lo spazio tempdb a causa di perdite di memoria. Ricompilare le interfacce CCI e assicurarsi che vengano mantenute in base a una pianificazione regolare.
Transazioni di grandi dimensioni Un volume elevato di CREATE TABLE AS SELECT (CTAS) istruzioni o INSERT SELECT riempie il database tempdb durante le operazioni di spostamento dei dati. Suddividere l'istruzione CTAS o INSERT SELECT in transazioni più piccole.
Allocazione di memoria insufficiente Le query con memoria allocata insufficiente (tramite la classe di risorse o il gruppo di carico di lavoro) possono essere distribuite in tempdb. Eseguire le query con una classe di risorse maggiore o un gruppo di carico di lavoro con più risorse.
Query di tabella esterna dell'utente finale Le query su tabelle esterne non sono ottimali per le query degli utenti finali perché il motore deve leggere l'intero file in tempdb prima di elaborare i dati. Caricare i dati in una tabella permanente e quindi indirizzarvi le query dell'utente.
Risorse complessive insufficienti È possibile che il pool SQL dedicato sia vicino alla capacità massima di tempdb durante l'attività elevata. Valutare la possibilità di aumentare le prestazioni del pool SQL dedicato in combinazione con una delle mitigazioni precedenti.

Risolvere i problemi relativi ai file di log delle transazioni tempdb completi

Il log delle transazioni tempdb in genere si riempie solo quando un client o un utente:

  • Apre una transazione esplicita, ma non rilascia mai un oggetto COMMIT o ROLLBACK.
  • Set IMPLICIT_TRANSACTION = ON (in particolare per client e strumenti JDBC che usano funzionalità AutoCommit).

Passaggio 1: Identificare le transazioni aperte

Le connessioni problematiche possono essere provenienti da client con una transazione aperta, ma in stato di inattività. Eseguire la query seguente per identificare questo scenario:

SELECT *
FROM sys.dm_pdw_exec_sessions
WHERE is_transactional = 1
AND status = 'Idle';

Nota: non tutte le connessioni restituite in seguito a questa query sono necessariamente problematiche. Eseguire la query almeno due volte con più di 15 minuti tra le esecuzioni e verificare quali connessioni vengono mantenute in questo stato.

Passaggio 2: Attenuare e prevenire il problema

Dopo aver identificato i client che contengono transazioni aperte, collaborare con gli utenti per modificare o entrambi:

  • Configurazione del driver (ad esempio: impostazione JDBC AutoCommit su off, che imposta IMPLICIT_TRANSACTIONS = ON)
  • Comportamenti di query ad hoc (ad esempio: esecuzione BEGIN TRAN non corretta senza COMMIT/ROLLBACK)

In alternativa, è possibile prendere in considerazione la creazione di un processo automatizzato per rilevare periodicamente questo scenario e terminare eventuali sessioni potenzialmente problematiche.

Risorse