Al mirar la lista de procedimientos almacenados que demoran mucho tiempo en ejecutarse, uno se destaca como el que más espera. Sin embargo, la mayor parte de esa espera (81%) es ASYNC_NETWORK_IO y sé por qué: el procedimiento almacenado transfiere aproximadamente 400 MB de información.
En la documentación, indica que la causa de ASYNC_NETWORK_IO es que el cliente no puede mantenerse al día con la avalancha de datos y eso probablemente sea cierto. No estoy seguro de cómo hacer que el cliente se mantenga al día, ya que todo lo que hace es llamar al procedimiento almacenado a través de un ADO.NET y luego solo procesa el conjunto de datos.
Entonces, dada esta información, ¿debería preocuparme por el tipo de espera ASYNC_NETWORK_IO para este procedimiento? ¿Realmente tiene un efecto en el rendimiento del servidor?
Información adicional:
- Estoy en el service pack 2 de SQL Server 2005.
- La aplicación cliente está en el mismo cuadro que SQL Server (lo sé, lo sé ... pero no puedo hacer nada al respecto).
Respuestas:
Como dijiste, este tipo de espera indica que la aplicación no está al día con SQL Server. Ahora, lo que eso realmente significa es que SQL Server no puede enviar los datos a través de la red tan rápido como quisiera.
Puede haber dos causas subyacentes:
Si la aplicación en sí es demasiado lenta, no habrá ningún impacto significativo en el rendimiento de otras consultas. Si, por otro lado, la tubería es demasiado pequeña, otras consultas tampoco pueden enviar sus resultados y tienen que esperar.
En el último caso, sin embargo, tendría todas las conexiones esperando en ASYNC_NETWORK_IO. Debería poder ver ese impacto claramente.
fuente
var dataSet = new DataSet();
var da = new SqlDataAdapter(command);
da.Fill(dataSet);
tanto, no estoy seguro de qué podría ser lento.