Устранение Неполадок Таймаута SqlExceptions
У меня есть некоторое любопытное поведение, которое я никак не могу понять, почему происходит. Я вижу прерывистые исключения таймаута. Я почти уверен, что это связано с объемом, потому что он не воспроизводится в нашей среде разработки. В качестве решения bandaid я попытался увеличить время ожидания команды sql до шестидесяти секунд, но, как я обнаружил, это, похоже, не помогает. Вот странная часть, когда я проверяю свои журналы на процесс, который терпит неудачу, вот начало и конец времена:
- 09/16/2008 16:21:49
- 09/16/2008 16:22:19
Так как же это может быть, что тайм-аут истекает через тридцать секунд, когда я установил тайм-аут команды на шестьдесят??
Просто для справки, вот исключение выбрасывается:
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
at SetClear.DataAccess.SqlHelper.ExecuteReader(CommandType commandType, String commandText, SqlParameter[] commandArgs)
5 ответов:
Время ожидания SQL-команд истекает, так как выполнение запроса, который вы используете, занимает больше времени. Выполните его в Query Analyzer или Management Studio, с репрезентативным объемом данных в базе данных, и посмотрите на план выполнения, чтобы узнать, что происходит медленно.
Если что-то занимает большой процент времени и описывается как "сканирование таблицы" или "сканирование кластеризованного индекса", посмотрите, можно ли создать индекс, который превратил бы эту операцию в поиск ключа (поиск индекса или кластеризованный индекс seek).
Это может показаться глупым, но просто выслушайте меня. Проверьте все индексы и первичные ключи, задействованные в запросе. Существуют ли они? Они фрагментированы? У меня была проблема, когда, по какой-то причине, запуск сценария напрямую работал просто найти, но потом, когда я сделал это через приложение, это было медленно, как грязь. Читатели в основном действуют как курсоры, поэтому индексация чрезвычайно важна.
Это может быть и не так, но это всегда первое, что я проверяю.
Потому что тайм-аут происходит на соединении, а не на команде. Вам нужно установить соединение .TimeOut свойство
Однажды у меня была такая проблема, и я отследил ее до действительно неэффективного кода SQL в одном из представлений моей базы данных. Кто-то поместил сложное условие с подзапросом в предложение ON для соединения таблицы, а не в предложение WHERE, где ему место. Как только я исправил эту ошибку, проблема исчезла.