Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wszelkie wady korzystania z ExecuteReaderAsync z C# AsyncCTP

Nie zgadzam się w tej sprawie z Ricką. Polecenia Async DB są nie tylko dobre, ale mają kluczowe znaczenie dla osiągnięcia skali, przepustowości i czas oczekiwania. Jego zastrzeżenie dotyczące czasu narastania puli wątków dotyczy tylko serwera WWW, na którym ruch jest niewielki.

W sytuacji dużego ruchu (która jest jedyną, która ma znaczenie), pula wątków nie będzie musiała czekać na „wstrzyknięcie” nowych wątków. Wykonywanie poleceń SQL asynchronicznie jest ważne nie tylko z punktu widzenia stanu żądań/wątków serwera WWW, ale także z punktu widzenia całkowitego czasu życia/opóźnienia żądania:nieskorelowane wywołania bazy danych mogą być wykonywane równolegle, a nie sekwencyjnie. Samo to skutkuje zwykle znaczną poprawą opóźnienia żądania HTTP, jakiego doświadcza użytkownik. Innymi słowy, Twoje strony ładują się szybciej.

Jedna rada:polecenie SQL nie jest naprawdę asynchroniczne, dopóki nie włączysz Asynchronous Processing=true w ciągu połączenia. Chociaż nie jest to ustawione (i domyślnie nie jest, Edytuj:zaczynając od .NET Framework <4.5. Asynchronous Processing nie jest już wymagane ) Twoje „asynchroniczne” wywołania BeginExecuteReader są tylko fikcją, połączenie uruchomi wątek i zablokuje to wątek. Gdy włączone jest prawdziwe przetwarzanie asynchroniczne w ciągu połączenia wtedy wywołanie jest naprawdę asynchroniczne, a wywołanie zwrotne jest oparte na zakończeniu IO.

Słowo ostrzeżenia:asynchroniczne polecenie SQL kończy się zaraz po pierwszym wynik wraca do klienta, a wiadomości informacyjne liczą się jako wynik.

create procedure usp_DetailsTagsGetAllFromApprovedPropsWithCount
as
begin
print 'Hello';
select complex query;
end

Straciłeś wszystkie korzyści płynące z asynchronii. print tworzy wynik, który jest wysyłany z powrotem do klienta, który kończy polecenie asynchroniczne, a wykonanie na kliencie jest wznawiane i kontynuowane z „reader.Read()”. Teraz to będzie blokować, dopóki złożone zapytanie nie zacznie generować wyników. Pytasz 'kto umieszcza print w procedurze?” ale print może być zamaskowany w coś innego, być może coś tak niewinnego jak INSERT który wykonuje bez pierwsze wydanie SET NOCOUNT ON .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2016:Utwórz tabelę ze skryptu SQL

  2. Kod stanu błędu strony internetowej SSRS 500

  3. Odległość między dwoma punktami przy użyciu typu danych Geografia w sqlserver 2008?

  4. To samo zapytanie - różne plany wykonania

  5. SQL Server:+(jednoargumentowy) operator na ciągach nienumerycznych