Устранение неисправностей Тайм-аут SqlExceptions - PullRequest
3 голосов
/ 17 сентября 2008

У меня есть какое-то любопытное поведение, из-за которого мне трудно понять, почему это происходит. Я вижу периодические исключения тайм-аута. Я уверен, что это связано с объемом, потому что он не воспроизводится в нашей среде разработки. Как решение проблемы, я попытался увеличить время ожидания команды 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 ]

3 голосов
/ 17 сентября 2008

Время ожидания команд SQL истекло, потому что для выполнения запроса требуется больше времени. Запустите его в Query Analyzer или Management Studio, с представительным количеством данных в базе данных , и посмотрите на план выполнения, чтобы выяснить, что происходит медленно.

Если что-то занимает большой процент времени и описывается как «сканирование таблицы» или «сканирование кластерного индекса», посмотрите, можете ли вы создать индекс, который превратит эту операцию в поиск ключа (поиск по индексу) или поиск по кластерному индексу).

3 голосов
/ 17 сентября 2008

Это может звучать глупо, но выслушай меня. Проверьте все индексы и первичные ключи, задействованные в вашем запросе. Они существуют? Они фрагментированы? У меня была проблема, когда по какой-то причине запуск скрипта работал просто находка, но потом, когда я делал это через приложение, это было медленно, как грязь. Читатель в основном действует как курсоры, поэтому индексация чрезвычайно важна.

Возможно, это не так, но я всегда проверяю первое.

0 голосов
/ 17 сентября 2008

Однажды у меня была эта проблема, и я отследил ее до некоторого действительно неэффективного кода SQL в одном из представлений моей базы данных. Кто-то поместил сложное условие с подзапросом в предложение ON для объединения таблиц, а не в предложение WHERE, к которому оно относится. После исправления этой ошибки проблема исчезла.

0 голосов
/ 17 сентября 2008

Поскольку в соединении возникает тайм-аут, а не команда. Вам необходимо установить connection.TimeOut свойство

0 голосов
/ 17 сентября 2008

Попробуйте изменить свойство времени ожидания SqlConnection, а не команды

...