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

Przekroczenie limitu czasu zapytania po wykonaniu z sieci, ale superszybkie po wykonaniu z SSMS

Więc twój kod C# wysyła zapytanie SQL ad hoc do SQL Server, przy użyciu jakiej metody? Czy rozważałeś użycie procedury składowanej? To prawdopodobnie zapewniłoby taką samą wydajność (przynajmniej w silniku) niezależnie od tego, kto go nazwał.

Czemu? Ustawienie ARITHABORT jest jedną z rzeczy, na które zwraca uwagę optymalizator podczas określania sposobu wykonania zapytania (a dokładniej w przypadku dopasowania planu). Możliwe, że plan w pamięci podręcznej ma to samo ustawienie co SSMS, więc używa planu z pamięcią podręczną, ale przy odwrotnym ustawieniu twój kod C# wymusza ponowną kompilację (lub może trafiłeś naprawdę ZŁE plan w pamięci podręcznej), co z pewnością może w wielu przypadkach zaszkodzić wydajności.

Jeśli już wywołujesz procedurę składowaną (nie opublikowałeś zapytania, ale myślę, że chciałeś), możesz spróbować dodać OPTION (RECOMPILE) do naruszającego zapytania (lub zapytań) w procedurze składowanej. Oznacza to, że te instrukcje zawsze będą się ponownie kompilować, ale może to uniemożliwić wykorzystanie złego planu, który wydaje się być realizowany. Inną opcją jest upewnienie się, że kiedy procedura składowana jest kompilowana, partia jest wykonywana z SET ARITHABORT ON.

Na koniec wydaje się, że pytasz, jak zmienić ustawienie ARITHABORT w SSMS. Myślę, że chciałeś zapytać, jak możesz wymusić ustawienie ARITHABORT w swoim kodzie. Jeśli zdecydujesz się kontynuować wysyłanie ad hoc SQL z aplikacji C#, możesz oczywiście wysłać polecenie jako tekst, który zawiera wiele instrukcji oddzielonych średnikami, np.:

SET ARITHABORT ON; SELECT ...

Więcej informacji o przyczynach występowania tego problemu można znaleźć w świetnym artykule Erlanda Sommarskoga:

  • Powoli w aplikacji, szybko w SSMS? Zrozumienie tajemnic wydajności


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak określić numer portu w parametrach połączenia programu SQL Server?

  2. Czy możliwe jest wykonanie pliku tekstowego z zapytania SQL?

  3. Czy ograniczenie Check może odnosić się do innej tabeli?

  4. Zapytanie, aby uzyskać tylko liczby z ciągu

  5. SUBSTRING Polecenie w SQL:elementarz