Является ли тип ожидания ASYNC_NETWORK_IO чем-то, о чем можно беспокоиться?

16

Рассматривая список хранимых процедур, выполнение которых занимает много времени, можно выделить наиболее ожидаемое. Однако большую часть этого ожидания (81%) составляет ASYNC_NETWORK_IO, и я знаю почему: хранимая процедура передает примерно 400 МБ информации.

В документации говорится, что причина ASYNC_NETWORK_IO заключается в том, что клиент не успевает за потоком данных, и это, вероятно, верно. Я не уверен, как заставить клиента не отставать, так как все, что он делает, это вызывает хранимую процедуру через ADO.NET, а затем просто обрабатывает набор данных.

Итак, учитывая эту информацию, следует ли мне беспокоиться о типе ожидания ASYNC_NETWORK_IO для этой процедуры? Влияет ли это на производительность сервера?

Дополнительные части информации:

  • Я нахожусь на пакете обновления 2 SQL Server 2005.
  • Клиентское приложение находится в той же коробке, что и SQL Server (я знаю, я знаю ... но я ничего не могу с этим поделать).
AngryHacker
источник
1
Лучший способ думать об этом типе ожидания состоит в том, что в вашем запросе нет ничего вызывающего - это возвращает данные клиенту. Вы также увидите, что многие из вас имеют связанные таблицы в Access. Одна возможность в зависимости от вашего клиентского приложения - разбить данные на более мелкие куски или просто вернуть меньше данных. Если это не вариант, вы, вероятно, будете ограничены в том, что вы можете сделать, чтобы уменьшить его.
JNK
Клиентское приложение подключается с использованием общей памяти или TCP / IP? Совместно ли клиентское приложение и SQL Server используют один и тот же набор процессорных ядер, или вы используете метод маскирования сродства для их разделения?
Джон Зигель
Это тип подключения по умолчанию - ничего особенного - поэтому он использует общую память. Оба приложения используют один и тот же набор ядер - сходства нет.
AngryHacker
Ваше хранилище SAN или локальное?
Эрик Хиггинс
@EricHiggins Просто локальный набор жестких дисков RAIDed.
AngryHacker

Ответы:

14

Как вы сказали, этот тип ожидания указывает, что приложение не поспевает за SQL Server. Теперь это означает, что SQL Server не может отправлять данные по сети так быстро, как хотелось бы.

Там может быть две основные причины:

  1. Приложение написано неэффективно и не обрабатывает строки достаточно быстро.
  2. Сеть максимизирована.

Если само приложение работает слишком медленно, это не окажет существенного влияния на производительность других запросов. С другой стороны, если канал слишком мал, другие запросы также не могут отправлять свои результаты и вынуждены ждать.

В последнем случае, однако, все соединения ожидают на ASYNC_NETWORK_IO. Вы должны быть в состоянии ясно увидеть это воздействие.

Себастьян Майн
источник
Для пункта 1. Поиск данных осуществляется через ADO.NET с использованием стандартного кода: var dataSet = new DataSet(); var da = new SqlDataAdapter(command); da.Fill(dataSet); поэтому я не уверен, что именно может быть медленным.
AngryHacker
Для пункта 2 маркировки. Приложение находится в том же окне, что и SQL, и соединение осуществляется с помощью метода общей памяти. Так что теоретически это должно быть супер быстро.
AngryHacker