Solucionar problemas de consultas lentas resultantes de ASYNC_NETWORK_IO tipo de espera
Sintomas
Quando 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 do buffer de saída. Se o aplicativo cliente parar ou não buscar os resultados rápido o suficiente, SQL Server precisará aguardar o reconhecimento 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, consulte o vídeo no Understanding ASYNC_NETWORK_IO Waits in SQL Server.
Esperas excessivas de ASYNC_NETWORK_IO podem causar dois problemas:
As consultas podem diminuir porque a duração total será maior.
Quando SQL Server aguarda o cliente buscar resultados, ele não pode 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 resolve o problema:
Conjunto de resultados grande
Alguns clientes de aplicativo solicitam milhares ou até milhões de linhas e processam os resultados aplicando filtros, classificação e agregações. Conjuntos de resultados grandes podem levar à utilização desnecessária da rede e ao processamento do aplicativo cliente.
Resolução: Os desenvolvedores de aplicativos devem equilibrar cuidadosamente o processamento entre SQL Server e clientes. Filtragem ou agregações podem ser executadas por SQL Server e o conjunto de resultados final pode ser pequeno. Limite o conjunto de resultados que chega aos clientes. Mais cálculos sobre os dados, apresentação e formatação são mais apropriados no lado do cliente, depois que os dados são recebidos.
O aplicativo não busca resultados rápido o suficiente
Se o aplicativo cliente não buscar resultados rápido o suficiente e não notificar SQL Server que o conjunto de resultados foi recebido, a ASYNC_NETWORK_IO
espera ocorrerá no servidor.
Para ilustrar usando ADO.NET, por padrão, DataSet e DataTable buscarão todas as linhas até a conclusão antes que o cliente possa acessá-la. No entanto, classes como SqlDataReader permitem que o desenvolvedor de aplicativos escolha o que fazer depois que cada linha for buscada do servidor. Um aplicativo pode buscar uma linha por vez e processar essa linha de acordo com os requisitos de negócios. Por exemplo:
Escreva a linha em um arquivo.
Envie a linha para outro aplicativo pela rede.
Aguarde algum tempo ou pela entrada do usuário.
Resolução: Para resolve o problema, busque todos os resultados o mais rápido possível usando um loop WHILE/FOR apertado. Isso significa que armazenar resulta na memória e só depois fazer mais processamento.
O computador de 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 recurso 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 recurso. Por exemplo:
Utilização 100% da CPU
Memória insuficiente (toda a memória é consumida)
E/S lenta (talvez o aplicativo grava resultados ou logs)
Essas restrições de recurso podem levar ao processamento lento dos resultados de entrada e fazer com que SQL Server experimente o tipo ASYNC_NETWORK_IO
de espera .
Resolução: Para resolve esse problema, use ferramentas como Monitor de Desempenho para diagnosticar o sistema que executa o aplicativo e, em seguida, eliminar quaisquer restrições de recurso. Um dos seguintes métodos pode funcionar para você:
Impedir que outros aplicativos sejam executados.
Corrija quaisquer problemas de código nesses aplicativos.
Atualize o hardware no sistema se os aplicativos estiverem totalmente ajustados.
NIC/Rede
A nic (rede lenta ou cartões de interface de rede) pode causar atrasos no tráfego de rede e naturalmente atrasará a busca dos resultados e a comunicação com SQL Server. Os atrasos de rede normalmente são causados pelos seguintes problemas:
Problemas do driver do adaptador de rede
Problemas de drivers de filtro de rede
Firewalls mal configurados ou defeituosos
Problemas de 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. Em seguida, você pode resolve o problema relacionado à rede para eliminar redefinições/retransmissões de pacotes.