2011-11-28 72 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