2008-09-16 5 views
3

У меня есть любопытное поведение, с которым мне трудно понять, почему происходит. Я вижу прерывистые тайм-ауты. Я почти уверен, что это связано с объемом, потому что он не воспроизводится в нашей среде разработки. В качестве решения для бандажей я попытался увеличить тайм-аут команды sql до шестидесяти секунд, но, как я нашел, это, похоже, не помогает. Вот что странно, когда я просматриваю журналы на процессе, который падает, вот начала и время окончания:Устранение неполадок Тайм-аут SqlExceptions

  • 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) 

ответ

3

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

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

+0

Оказалось, что нам просто нужно добавить новый индекс :-) – 2008-09-24 14:15:23

0

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

0

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

3

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

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

0

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