Troubleshoot tempdb errors on a dedicated SQL pool
Aplica-se ao: Azure Synapse Analytics
Em um pool de SQL dedicado, o banco de dados tempdb é usado para tabelas temporárias e espaço intermediário para movimentações de dados (por exemplo: movimentações aleatórias, movimentações de corte), classificações, cargas, derramamentos de memória e outras operações. Além disso, uma transação não confirmada em uma sessão que interage com o banco de dados tempdb impedirá que o log libere todas as outras sessões, fazendo com que os arquivos de log sejam preenchidos. Como o banco de dados tempdb é um recurso compartilhado, o grande consumo do espaço tempdb pode fazer com que as consultas de outros usuários falhem e podem ser escalonadas para impedir que novas conexões sejam estabelecidas.
O que fazer se eu não conseguir me conectar ao pool de SQL dedicado?
Se você não tiver conexões existentes para identificar conexões ou consultas problemáticas, o único método para resolver a incapacidade de criar uma nova conexão é Pausar e Retomar ou Dimensionar o pool de SQL dedicado. Essa ação encerrará as transações do usuário que levaram a esse problema e recriará o banco de dados tempdb quando o serviço for reiniciado.
Observação: certifique-se de dar ao serviço tempo extra para desfazer todas as transações em execução, pois as operações de pausa e escala podem levar mais tempo do que o normal para serem concluídas nesse cenário.
Solucionar problemas de arquivos de dados tempdb completos
Etapa 1: Identificar a consulta que preenche o banco de dados tempdb
Certifique-se de identificar a consulta que preenche o banco de dados tempdb enquanto a consulta está sendo executada, a menos que você tenha implementado um componente de log em sua estrutura ETL ou auditoria de suas instruções de pool de SQL dedicadas. Na maioria dos casos, nem sempre, a consulta de execução mais longa executada durante o período em que o problema ocorreu é a causa dos erros de tempdb sem espaço. Execute a seguinte consulta para obter uma lista de consultas de longa duração:
SELECT TOP 5 *
FROM sys.dm_pdw_exec_requests
WHERE status = 'running'
ORDER BY total_elapsed_time desc;
Depois de ter uma consulta razoavelmente suspeita, tente uma das seguintes opções:
- Mate a declaração.
- Tente impedir que qualquer outra carga de trabalho consuma ainda mais o espaço tempdb para que o executor longo possa ser concluído.
Passo 2: Evite a recorrência
Depois de identificar e tomar medidas em relação à consulta responsável, considere implementar mitigações para evitar que o problema se repita. A tabela a seguir mostra mitigações para as causas mais comuns de erros de tempdb completo:
Motivo | Descrição | Mitigação |
---|---|---|
Plano ineficaz distribuído | O plano distribuído gerado para uma determinada consulta pode introduzir inadvertidamente a movimentação de dados de alta frequência como resultado de estatísticas de tabela mal mantidas. | Atualize as estatísticas das tabelas relevantes e certifique-se de que elas sejam mantidas regularmente. |
Integridade fraca do CCI (Índice Columnstore Clusterizado) | Ele consome o espaço tempdb devido a derramamentos de memória. | Reconstrua os CCIs e certifique-se de que eles sejam mantidos em um cronograma regular. |
Transações grandes | Um grande volume de instruções or INSERT SELECT preenche o tempdb durante as operações de movimentação de CREATE TABLE AS SELECT (CTAS) dados. |
Divida sua instrução CTAS ou INSERT SELECT em várias transações menores. |
Alocação de memória insuficiente | Consultas com memória insuficiente alocada (por meio de classe de recurso ou grupo de carga de trabalho) podem se espalhar para o tempdb . |
Execute suas consultas com uma classe de recurso maior ou um grupo de carga de trabalho com mais recursos. |
Consultas de tabela externa do usuário final | As consultas em tabelas externas não são ideais para consultas de usuário final porque o mecanismo precisa ler o arquivo tempdb inteiro antes de processar os dados. |
Carregue os dados em uma tabela permanente e, em seguida, direcione as consultas do usuário para ela. |
Recursos gerais insuficientes | Você pode descobrir que seu pool de SQL dedicado está próximo de sua capacidade máxima de tempdb durante a alta atividade. | Considere escalar verticalmente seu pool de SQL dedicado em combinação com qualquer uma das mitigações acima. |
Solucionar problemas de arquivos de log de transações tempdb completos
O log de transações tempdb normalmente só é preenchido quando um cliente/usuário:
- Abre uma transação explícita, mas nunca emite um
COMMIT
ouROLLBACK
. - Conjuntos
IMPLICIT_TRANSACTION = ON
(especialmente para clientes JDBC e ferramentas que usam recursos de AutoCommit).
Etapa 1: Identificar transações abertas
As conexões problemáticas podem ser de clientes que têm uma transação aberta, mas estão em um status "Ocioso". Execute a seguinte consulta para ajudar a identificar esse cenário:
SELECT *
FROM sys.dm_pdw_exec_sessions
WHERE is_transactional = 1
AND status = 'Idle';
Observação: nem todas as conexões retornadas como resultado dessa consulta são necessariamente problemáticas. Execute a consulta pelo menos duas vezes com mais de 15 minutos entre as execuções e veja quais conexões persistem nesse estado.
Etapa 2: mitigar e evitar o problema
Depois de identificar quais clientes estão mantendo transações abertas, trabalhe com os usuários para alterar um ou ambos:
- Configuração do driver (por exemplo: configuração do JDBC AutoCommit como
off
, que defineIMPLICIT_TRANSACTIONS = ON
) - Comportamentos de consulta ad hoc (por exemplo: execução
BEGIN TRAN
incorreta sem/COMMIT
ROLLBACK
)
Como alternativa, você pode considerar a criação de um processo automatizado para detectar periodicamente esse cenário e eliminar quaisquer sessões potencialmente problemáticas.
Recursos
- Confira a DMV sys.dm_pdw_errors para verificar erros.