Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podsumowanie
Błąd przekroczenia limitu czasu zapytania w SQL Server występuje, gdy zapytanie nie zwraca danych przed wygaśnięciem limitu czasu polecenia aplikacji klienckiej. Następnie aplikacja kliencka anuluje zapytanie i raporty "Upłynął limit czasu". W tym artykule wyjaśniono, jak potwierdzić, że wystąpił limit czasu zapytania (nie limit czasu połączenia), jak zidentyfikować określone zapytanie, korelując attention zdarzenie z zdarzeniami rozszerzonymi sql_batch_completed i rpc_completed ustawiając limit czasu polecenia w ADO.NET, ODBC, JDBC, OLE DB i ADO. Najczęstszą przyczyną jest powolne zapytanie, dlatego zalecaną poprawką jest dostrojenie zapytania, a nie tylko podniesienie wartości limitu czasu. Użyj tego artykułu, gdy aplikacja zgłasza błędy przekroczenia limitu czasu, podczas gdy SQL Server rejestruje zdarzenia uwagi (błąd 3617) z czasem trwania, który jest ściśle zgodny ze skonfigurowanym limitem czasu.
Objawy błędu przekroczenia limitu czasu zapytania
Załóżmy, że aplikacja wysyła zapytania o dane z bazy danych programu SQL Server. Jeśli zapytanie nie zwraca żadnych danych w skonfigurowanej wartości limitu czasu (zazwyczaj 30 sekund), aplikacja anuluje zapytanie i generuje jeden z następujących komunikatów o błędach:
-
Upłynął limit czasu. Limit czasu upłynął przed ukończeniem operacji lub serwer nie odpowiada. Instrukcja została zakończona.
-
System.Data.SqlClient.SqlException: Upłynął limit czasu. Limit czasu upłynął przed ukończeniem operacji lub serwer nie odpowiada.
Dlaczego występują błędy przekroczenia limitu czasu zapytania
Te błędy występują po stronie aplikacji. Aplikacja ustawia wartość limitu czasu i jeśli zostanie osiągnięty limit czasu, anuluje zapytanie. Po stronie programu SQL Server anulowanie zapytania po stronie klienta powoduje zdarzenie uwagi, błąd 3617 (MSSQLSERVER_3617). Jeśli wartość limitu czasu po stronie aplikacji jest ustawiona na 0 (bez limitu czasu), Database Engine wykonuje zapytanie, dopóki nie zostanie ukończone, niezależnie od tego, jak długo jest to, milisekund lub dni.
Wartość limitu czasu jest ustawiana inaczej dla każdego sterownika dostępu do danych lub interfejsu API:
- W środowisku .NET Framework System.Data.SqlClient wartość limitu czasu jest ustawiana we właściwości CommandTimeout.
- W Microsoft. Data.SqlClient, bieżący sterownik ADO.NET dla SQL Server, jest ustawiony we właściwości SqlCommand.CommandTimeout.
- W interfejsie API ODBC jest ustawiany za pomocą atrybutu
SQL_ATTR_QUERY_TIMEOUTw funkcji SQLSetStmtAttr . - W interfejsie API JDBC (Java Database Connectivity) jest on ustawiany za pośrednictwem metody setQueryTimeout.
- W bazie DANYCH OLEDB jest ustawiana za pomocą
DBPROP_COMMANDTIMEOUTwłaściwości wDBPROPstrukturze. - W programie VBA (Excel) jest on ustawiany za pośrednictwem właściwości ADODB.Command.CommandTimeout.
Limit czasu zapytania różni się od właściwości limitu czasu połączenia. Ten ostatni kontroluje czas oczekiwania na pomyślne połączenie i nie jest zaangażowany w wykonywanie zapytań. Aby uzyskać więcej informacji, zobacz Limit czasu zapytania nie jest taki sam jak limit czasu połączenia.
Kroki identyfikowania i rozwiązywania problemów z zapytaniem, które upłynął limit czasu
Najczęstszą przyczyną przekroczenia limitu czasu zapytania jest niepełne wyniki zapytań. Oznacza to, że zapytanie działa dłużej niż wstępnie zdefiniowana wartość limitu czasu zapytania. Aby rozwiązać ten problem, wykonaj zapytanie szybciej. Poniżej przedstawiono sposób sprawdzania zapytań:
Użyj zdarzeń rozszerzonych lub śledzenia SQL , aby zidentyfikować zapytania, które powodują błędy przekroczenia limitu czasu. Zdarzenie uwagi można śledzić
session_idJeśli zauważysz, że ukończone zdarzenie jest natychmiast obserwowane przez zdarzenie uwagi, a czas trwania ukończonego zdarzenia w przybliżeniu odpowiada ustawieniu limitu czasu, zidentyfikowano zapytanie. Oto przykład:Uwaga 16.
W tym przykładzie
SELECTzapytanie jest uruchamiane przez prawie dokładnie 30 sekund i zatrzymuje się. Zdarzenie uwagi o tym samym identyfikatorze sesji wskazuje, że aplikacja anulowała zapytanie.Nazwisko Session_id Sql_text Czas trwania (mikrosekundy) Sygnatura czasowa sql_batch_started 54 Wybierz … from Customers WHERE cid = 192937 NULL 2021-09-30 09:50:25.0000 sql_batch_completed 54 Wybierz … from Customers WHERE cid = 192937 29999981 2021-09-30 09:50:55.0000 Uwaga 54 Wybierz … from Customers WHERE cid = 192937 40000 2021-09-30 09:50:55.0400 Wykonaj i przetestuj zapytania w narzędziu sqlcmd lub w programie SQL Server Management Studio (SSMS).
Jeśli zapytania są również powolne w programie sqlcmd i programie SSMS, rozwiąż problemy i zwiększ wydajność zapytań. Aby uzyskać szczegółowe informacje, zobacz Rozwiązywanie problemów z wolno działającymi zapytaniami w SQL Server.
Uwaga 16.
W usługach sqlcmd i SSMS wartość limitu czasu jest ustawiona na 0 (bez limitu czasu) i można testować i badać zapytania.
Jeśli zapytania są szybkie w usługach sqlcmd i SSMS, ale powolna po stronie aplikacji, zmień zapytania tak, aby używały tych samych opcji ZESTAWU używanych w programie sqlcmd i programie SSMS. Porównaj opcje SET, zbierając ślad zdarzeń rozszerzonych (identyfikator logowania i łączenia zdarzeń za pomocą
collect_options_textpolecenia ) i sprawdzając kolumnęoptions_text. Oto przykład:ALTER EVENT SESSION [setOptions] ON SERVER ADD EVENT sqlserver.existing_connection(SET collect_options_text=(1) ACTION(package0.event_sequence,package0.last_error,sqlos.system_thread_id,sqlserver.context_info,sqlserver.session_id,sqlserver.sql_text)), ADD EVENT sqlserver.login(SET collect_options_text=(1) ACTION(sqlos.system_thread_id,sqlserver.context_info,sqlserver.sql_text))Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z różnicą wydajności zapytań między aplikacją bazy danych i programem SSMS.
Sprawdź,
CommandTimeoutczy ustawienie jest mniejsze niż oczekiwany czas trwania zapytania. Jeśli ustawienie użytkownika jest poprawne i nadal występują przekroczenia limitu czasu, wynika to z problemu z wydajnością zapytań. Oto przykład kodu ADO.NET z wartością limitu czasu ustawioną na 10 sekund:using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.SqlClient; using System.Data; namespace ConsoleApplication6 { class Program { static void Main() { string ConnectionString = @"Data Source=.\sql2019;Integrated Security=SSPI;Initial Catalog=tempdb;"; string queryString = "exec test"; using (SqlConnection connection = new SqlConnection(ConnectionString)) { connection.Open(); SqlCommand command = new SqlCommand(queryString, connection); // Setting command timeout to 10 seconds command.CommandTimeout = 10; //command.ExecuteNonQuery(); try { command.ExecuteNonQuery(); } catch (SqlException e) { Console.WriteLine("Got expected SqlException due to command timeout "); Console.WriteLine(e); } } } } }
Limit czasu zapytania nie jest taki sam jak limit czasu połączenia
Limit czasu zapytania różni się od limitu czasu połączenia lub limitu czasu logowania. Przekroczenie limitu czasu połączenia lub logowania występuje, gdy początkowe połączenie z serwerem bazy danych osiągnie wstępnie zdefiniowany limit czasu. W tym momencie klient nie wysłał żadnych zapytań do serwera. Te komunikaty to przykłady błędów przekroczenia limitu czasu połączenia lub przekroczenia limitu czasu logowania:
-
Upłynął limit czasu połączenia. Podczas próby wykorzystania potwierdzenia uzgodnienia przed logowaniem upłynął limit czasu. Może to być spowodowane tym, że uzgadnianie przed logowaniem nie powiodło się lub serwer nie mógł odpowiedzieć na czas. Zużycie czasu podczas próby nawiązania połączenia z tym serwerem: [przed logowaniem] inicjowanie=23; uzgadnianie=14979;
-
Upłynął limit czasu. Limit czasu upłynął przed ukończeniem operacji lub serwer nie odpowiada. System.ComponentModel.Win32Exception (0x80004005): Upłynął limit czasu operacji oczekiwania.
Wartość limitu czasu połączenia jest ustawieniem po stronie klienta i zazwyczaj jest ustawiona na 15 sekund. Aby uzyskać więcej informacji na temat rozwiązywania problemów z limitem czasu połączenia, zobacz Rozwiązywanie problemów z błędami przekroczenia limitu czasu połączenia.
Treści powiązane
- Wideo — limit czasu polecenia SQL Server
- Przekroczenie limitu czasu wygasłych komunikatów podczas nawiązywania połączenia z usługą SQL Server
- Rozwiązywanie problemów z powolnym uruchamianiem zapytań w programie SQL Server
- Rozwiązywanie problemów z różnicą wydajności zapytań między aplikacją bazy danych a programem SSMS
- Poznaj i rozwiąż problemy z blokowaniem w SQL Server
- Rozwiązywanie problemów z zapytaniem, które nigdy nie kończy się SQL Server
- Konfigurowanie opcji konfiguracji serwera limitu czasu zapytania zdalnego