Solucionar problemas de consultas lentas resultantes de ASYNC_NETWORK_IO tipo de espera
Sintomas
Quando o SQL Server produz conjuntos de resultados e os envia para um aplicativo cliente colocando os resultados em um buffer de saída, o aplicativo cliente os busca no buffer de saída. Se o aplicativo cliente for interrompido ou não buscar os resultados com rapidez suficiente, o SQL Server precisará aguardar a confirmação de que o aplicativo cliente recebeu todos os resultados antes de enviar mais resultados. Essa espera aparecerá como ASYNC_NETWORK_IO
. Para obter mais informações, assista ao vídeo em Noções básicas sobre ASYNC_NETWORK_IO esperas no SQL Server.
Esperas excessivas de ASYNC_NETWORK_IO podem causar dois problemas:
As consultas poderão ficar mais lentas porque aumentará a duração total.
Enquanto o SQL Server aguardar a busca de resultados pelo cliente, não será possível liberar bloqueios adquiridos. Se o bloqueio não for liberado por muito tempo, outras sessões serão bloqueadas no SQL Server.
Causas e resoluções
As seções a seguir listam as causas comuns para esse tipo de espera e as etapas correspondentes para resolver o problema:
Grande conjunto de resultados
Alguns clientes de aplicativos solicitam milhares ou até milhões de linhas e, em seguida, processam os resultados aplicando filtros, classificação e agregações. Grandes conjuntos de resultados podem levar à utilização desnecessária da rede e ao processamento de aplicativos cliente.
Resolução: os desenvolvedores de aplicativos devem equilibrar cuidadosamente o processamento entre o SQL Server e os clientes. A filtragem ou agregação pode ser executada pelo SQL Server e o conjunto de resultados final pode ser pequeno. Limite o conjunto de resultados que chega aos clientes. Quaisquer outros cálculos sobre os dados, apresentação e formatação são mais apropriados no lado do cliente, uma vez que os dados são recebidos.
O aplicativo não busca resultados rápido o suficiente
Se o aplicativo cliente não buscar resultados com rapidez suficiente e não notificar SQL Server de que o conjunto de resultados foi recebido, a ASYNC_NETWORK_IO
espera ocorrerá no servidor.
Para ilustrar o uso do ADO.NET, por padrão, DataSet e DataTable buscarão todas as linhas até a conclusão antes que o cliente possa acessá-las. No entanto, classes como SqlDataReader permitem que o desenvolvedor do aplicativo escolha o que fazer depois que cada linha for buscada no servidor. Um aplicativo pode buscar uma linha por vez e, em seguida, processar essa linha de acordo com os requisitos de negócios. Por exemplo:
Grave a linha em um arquivo.
Envie a linha para outro aplicativo pela rede.
Aguarde algum tempo ou a entrada do usuário.
Resolução: para resolver o problema, busque todos os resultados o mais rápido possível usando um loop WHILE/FOR apertado. Isso significa armazenar os resultados na memória e só então fazer mais processamento.
A máquina do aplicativo cliente está sob estresse (E/S, memória ou CPU)
Mesmo que o código do aplicativo seja desenvolvido para buscar resultados o mais rápido possível, problemas de recursos do sistema podem fazer com que todo o processo do cliente seja lento. Por exemplo:
O aplicativo pode não buscar resultados rapidamente se o computador que executa o aplicativo cliente tiver restrições de recursos. Por exemplo:
100% de utilização de CPU
Memória insuficiente (toda a memória é consumida)
E/S lenta (talvez o aplicativo grave resultados ou logs)
Essas restrições de recursos podem levar a um processamento lento dos resultados de entrada e fazer com que o SQL Server experimente o tipo ASYNC_NETWORK_IO
de espera .
Resolução: para resolver esse problema, use ferramentas como o Monitor de Desempenho para diagnosticar o sistema que executa o aplicativo e, em seguida, elimine quaisquer restrições de recursos. Um dos seguintes métodos pode funcionar para você:
Interrompa a execução de outros aplicativos.
Corrija quaisquer problemas de código nesses aplicativos.
Atualize o hardware no sistema se os aplicativos tiverem sido totalmente ajustados.
NIC/Rede
A rede lenta ou as placas de adaptador de rede (NICs) podem causar atrasos no tráfego de rede e, naturalmente, atrasarão a busca dos resultados e a comunicação com o SQL Server. Os seguintes problemas costumam gerar atrasos na rede:
Problemas de driver do adaptador de rede
Problemas de drivers de filtro de rede
Firewalls com configuração incorreta ou com falha
Problemas com roteadores
Redes sobrecarregadas devido ao tráfego (menos comum)
Resolução: para diagnosticar esses problemas, você pode coletar um rastreamento de rede e procurar redefinições e retransmissões de pacotes. Você pode então resolver o problema relacionado à rede para eliminar redefinições/retransmissões de pacotes.