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

Czy SET NOCOUNT ON naprawdę robi tak dużą różnicę w wydajności?

Istnieją scenariusze, w których opcja SET NOCOUNT ON jest obowiązkowa. Podczas projektowania warstwy środkowej o wysokiej wydajności opartej na przetwarzaniu asynchronicznym wykorzystującym pulę wątków za pomocą metod BeginExecuteXXX programu SqlClient, występuje bardzo poważny problem z liczbą wierszy. Metody BeginExecute kończą się zaraz po pierwszym pakiet odpowiedzi jest zwracany przez serwer. Ale kiedy wywoływane jest EndExecuteXXX, kończy się to na żądaniach innych niż zapytania po zakończeniu połączenia. Każda odpowiedź licznika wierszy jest odpowiedzią. Podczas przetwarzania nawet umiarkowanie skomplikowanych procedur liczba pierwszych wierszy może powrócić w ciągu 5-10 ms, podczas gdy połączenie kończy się w ciągu 300-500 ms. Zamiast wywołania złożonego żądania asynchronicznego po 500ms, oddzwania po 5 ms, a następnie bloki wywołania zwrotnego w EndExecuteXXX przez 495 ms. W rezultacie wywołania asynchroniczne kończą się przedwcześnie i blokują wątek z puli wątków w wywołaniach EndExecuteNonQuery. Prowadzi to do zagłodzenia ThreadPool. Widziałem, jak systemy o wysokiej wydajności poprawiają przepustowość z setek połączeń na sekundę do tysięcy połączeń na sekundę po prostu przez dodanie opcji SET NOCOUNT ON w określonych sytuacjach.

Biorąc pod uwagę, że w przypadku przetwarzania na dużą skalę/wysokiej przepustowości wywołania asynchroniczne w warstwie pośredniej są jedyną drogą do przejścia, NOCOUNT jest prawie obowiązkowym wymaganiem.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy kolejność kolumn w klauzuli WHERE ma znaczenie?

  2. Użyj @@IDENTITY, aby zwrócić ostatnio wstawioną wartość tożsamości w programie SQL Server

  3. Jak wstawić aktualną datę w kolumnie wiersza

  4. Jak włączyć wszystkie ograniczenia sprawdzania w bazie danych SQL Server — samouczek SQL Server / TSQL, część 88

  5. W SQL Server, jak utworzyć pętlę while w select