Patrząc na listę procedur przechowywanych, których wykonanie zajmuje dużo czasu, wyróżnia się jako powodująca najwięcej oczekiwania. Jednak większość tego oczekiwania (81%) to ASYNC_NETWORK_IO i wiem dlaczego: procedura przechowywana przesyła około 400 MB informacji.
W dokumentacji stwierdza, że przyczyną ASYNC_NETWORK_IO jest to, że klient nie jest w stanie nadążyć za zalewem danych i to prawdopodobnie prawda. Nie jestem pewien, jak sprawić, by klient nadążył, ponieważ wystarczy wywołać procedurę przechowywaną za pośrednictwem ADO.NET, a następnie po prostu przetwarza zestaw danych.
Biorąc pod uwagę te informacje, czy powinienem martwić się typem oczekiwania ASYNC_NETWORK_IO na tę procedurę? Czy to rzeczywiście wpływa na wydajność serwera?
Dodatkowe informacje:
- Korzystam z dodatku Service Pack 2 dla programu SQL Server 2005.
- Aplikacja kliencka znajduje się w tym samym pudełku co SQL Server (wiem, wiem ... ale nic nie mogę na to poradzić).
Odpowiedzi:
Jak powiedziałeś, ten typ oczekiwania wskazuje, że aplikacja nie nadąża za programem SQL Server. To tak naprawdę oznacza, że SQL Server nie może wysyłać danych przez sieć tak szybko, jak by chciał.
Mogą być dwie podstawowe przyczyny:
Jeśli sama aplikacja jest zbyt wolna, nie będzie znacznego wpływu na wydajność innych zapytań lub nie będzie jej wcale. Jeśli z drugiej strony potok jest zbyt mały, inne zapytania również nie mogą wysłać swoich wyników i muszą poczekać.
W tym drugim przypadku wszystkie połączenia czekałyby na ASYNC_NETWORK_IO. Powinieneś być w stanie wyraźnie zobaczyć ten wpływ.
źródło
var dataSet = new DataSet();
var da = new SqlDataAdapter(command);
da.Fill(dataSet);
Nie jestem więc pewien, co dokładnie może być wolne.