2011-11-28 45 views
1

所以我們有一個運行的進程,它調用我們的數據庫來獲取一些數據。當我們運行通過SQL Server Management Studio調用的proc時,運行需要6分鐘到15分鐘,但是完成。當我們通過代碼運行它時,它總是超時。我的猜測是代碼的預期超時範圍被超出了,但proc實際上仍然可以運行,因爲它直接通過Management Studio界面。通過.NET代碼的SQL超時

這裏的異常詳細信息:

InnerException: System.Data.SqlClient.SqlException 
     Message=Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
     Source=.Net SqlClient Data Provider 
     ErrorCode=-2146232060 
     Class=11 
     LineNumber=0 
     Number=-2 
     Procedure="" 
     Server=KSQCOREDBINT 
     State=0 

而這裏的堆棧跟蹤,如果有幫助的所有:

StackTrace: 
      at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
      at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
      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.ExecuteDbDataReader(CommandBehavior behavior) 
      at System.Data.Linq.SqlClient.SqlProvider.Execute(Expression query, QueryInfo queryInfo, IObjectReaderFactory factory, Object[] parentArgs, Object[] userArgs, ICompiledSubQuery[] subQueries, Object lastResult) 
      at System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) 
      at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
      at Chatham.Panda.DataAccessLayer.CoreDataContext.sp_calc_schedule_rates_retrieve(Nullable`1 se_sched_id) in c:\TeamCity\BuildAgent02\work\36e300184c20475\Chatham.Panda.DataAccessLayer\Core.designer.cs:line 2306 
      at Chatham.Panda.EndOfDay.EodDataAccess.<>c__DisplayClass15.<SpCalcScheduleRatesRetrieve>b__14(CoreDataManager coreDataManager) in C:\svn\K2\trunk\panda\ScheduleBuilderService\Chatham.Panda.EndOfDay\EodDataAccess.cs:line 134 
      at Chatham.Panda.EndOfDay.EodDataAccess.RunStoredProc[T](Func`2 storedProcDelegate, String storedProcName) in C:\svn\K2\trunk\panda\ScheduleBuilderService\Chatham.Panda.EndOfDay\EodDataAccess.cs:line 21 

反正我們可以增加分配超時範圍還是什麼?我們一直致力於改進存儲過程,但這取決於數據庫團隊。只是想看看我能否爲我做點什麼。

謝謝。

+4

增大[SqlCommand的的的CommandTimeout(http://msdn.microsoft.com /en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx)或將其設置爲0(無限制)。 –

回答

3

SQL命令超時需要比執行更長的時間。在查詢分析器或管理工作室中使用數據庫中具有代表性的數據量執行它,並查看執行計劃以瞭解速度緩慢。

如果某些事情佔用了很大一部分時間,並被描述爲「表掃描」或「聚集索引掃描」,請查看是否可以創建將該操作轉換爲密鑰查找的索引(索引尋求或聚集索引尋找)。

Troubleshooting Timeout SqlExceptions

您可以設置的CommandTimeout上一個SqlCommand:

objCmd.CommandTimeout = 600 

SqlConnection.ConnectionTimeout是隻讀屬性

4

有多達3個超時保持的

  • 連接超時的軌道 - 這需要多長時間來打開一個連接到數據庫
  • 命令超時 - 這就是現在適用你,你。這是查詢在結束之前可以運行多長時間。
  • 頁面超時 - 我沒有看到你說的,但如果這是一個ASP.NET頁面,你可以因爲查詢您正在使用運行到頁面超時
+1

+1我想補充一點,你應該一般保持你的連接超時時間**低**,並調整你的語句的典型持續時間的命令超時。 – Yuck