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

Przekroczono limit czasu zapytania z aplikacji internetowej, ale działa dobrze w studiu zarządzania

Właśnie tego nauczyłem się do tej pory z moich badań.

.NET wysyła ustawienia połączenia, które nie są takie same, jak te, które otrzymujesz po zalogowaniu się do Management Studio. Oto, co zobaczysz, jeśli podsłuchasz połączenie za pomocą Sql Profiler:

-- network protocol: TCP/IP  
set quoted_identifier off  
set arithabort off  
set numeric_roundabort off  
set ansi_warnings on  
set ansi_padding on  
set ansi_nulls off  
set concat_null_yields_null on  
set cursor_close_on_commit off  
set implicit_transactions off  
set language us_english  
set dateformat mdy  
set datefirst 7  
set transaction isolation level read committed  

Teraz wklejam te ustawienia powyżej każdego zapytania, które uruchamiam po zalogowaniu się do serwera sql, aby upewnić się, że ustawienia są takie same.

W tym przypadku wypróbowałem każde ustawienie osobno, po rozłączeniu i ponownym połączeniu, i stwierdziłem, że zmiana arithabortu z wyłączonego na włączony zmniejszyła problem z 90 sekund do 1 sekundy.

Najbardziej prawdopodobne wyjaśnienie dotyczy sniffingu parametrów, który jest techniką używaną przez Sql Server do wybierania tego, co uważa za najbardziej efektywny plan zapytań. Gdy zmienisz jedno z ustawień połączenia, optymalizator zapytań może wybrać inny plan, aw tym przypadku najwyraźniej wybrał zły.

Ale nie jestem o tym do końca przekonany. Próbowałem porównać rzeczywiste plany zapytań po zmianie tego ustawienia i jeszcze nie widziałem, aby różnica zawierała jakiekolwiek zmiany.

Czy jest coś jeszcze w ustawieniu algorytmu arithabor, które w niektórych przypadkach może powodować powolne działanie zapytania?

Rozwiązanie wydawało się proste:po prostu umieść zestaw arithabort na górze procedury składowanej. Ale może to prowadzić do odwrotnego problemu:zmienić parametry zapytania i nagle działa szybciej z 'off' niż 'on'.

Na razie uruchamiam procedurę „z rekompilacją”, aby upewnić się, że plan zostanie za każdym razem zregenerowany. W przypadku tego konkretnego raportu jest OK, ponieważ ponowna kompilacja może zająć sekundę, a nie jest to zbyt widoczne w przypadku raportu, który zwraca 1-10 sekund (to potwór).

Ale nie jest to opcja dla innych zapytań, które są uruchamiane znacznie częściej i muszą powrócić tak szybko, jak to możliwe, w ciągu zaledwie kilku milisekund.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 6 funkcji do pobrania dnia, miesiąca i roku z daty w SQL Server

  2. SQL Server IF a IIF():jaka jest różnica?

  3. Pięć najważniejszych kwestii dotyczących projektowania indeksu bazy danych w programie SQL Server

  4. Opcjonalne argumenty w klauzuli WHERE

  5. 2 sposoby tworzenia tabeli na serwerze połączonym za pomocą T-SQL