Solucionar problemas de erros de tempdb em um pool de SQL dedicado
Aplica-se a: 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 de embaralhar, cortar movimentos), classificações, cargas, derramamentos de memória e outras operações. Além disso, uma transação não comprometida 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 possam escalar para impedir que novas conexões sejam estabelecidas.
O que fazer se eu não puder 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 será Pausar e Retomar ouDimensionar o pool de SQL dedicado. Essa ação encerrará as transações de usuário que levaram a esse problema e recriará o banco de dados tempdb quando o serviço for reiniciado.
Nota: Certifique-se de dar tempo extra ao serviço 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 dedicadas do pool de SQL. 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 temporários fora do espaço. Execute a consulta a seguir 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, experimente uma das seguintes opções:
- Mate a instrução.
- Tente impedir que qualquer outra carga de trabalho consuma ainda mais o espaço tempdb para que o corredor longo possa ser concluído.
Etapa 2: impedir a recorrência
Depois de identificar e tomar medidas contra a 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 completos de tempdb:
Motivo | Descrição | Atenuação |
---|---|---|
Plano mal 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 para tabelas relevantes e verifique se elas são mantidas em uma agenda regular. |
Integridade de CCI (índice columnstore clusterizado) ruim | Ele consome o espaço tempdb devido a derramamentos de memória. | Recompile as CCIs e verifique se elas são mantidas em uma agenda regular. |
Transações grandes | Um grande volume de CREATE TABLE AS SELECT (CTAS) instruções ou INSERT SELECT preenche o tempdb durante as operações de movimentação de dados. |
Quebre sua CTAS instrução 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 ser derramadas em 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 | Consultas em tabelas externas não são ideais para consultas de usuário final porque o mecanismo precisa ler todo o arquivo tempdb antes de processar os dados. |
Carregue os dados em uma tabela permanente e, em seguida, direcione as consultas de usuário para lá. |
Recursos globais insuficientes | Você pode descobrir que o pool de SQL dedicado está próximo à capacidade máxima de tempdb durante a alta atividade. | Considere escalar o 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
Normalmente, o log de transações tempdb 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 do 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 consulta a seguir para ajudar a identificar este 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 execuções e veja quais conexões persistem nesse estado.
Etapa 2: Mitigar e impedir o problema
Depois de identificar quais clientes estão realizando transações abertas, trabalhe com os usuários para alterar 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: executar
BEGIN TRAN
incorretamente sem/COMMIT
ROLLBACK
)
Como alternativa, você pode considerar a criação de um processo automatizado para detectar periodicamente esse cenário e eliminar sessões potencialmente problemáticas.
Recursos
- Consulte o sys.dm_pdw_errors de DMV para obter erros.