存储过程有时会在通过RPC调用时超时,但在SQL调用时总是正常

时间:2013-10-11 13:03:37

标签: sql-server sql-server-2008 stored-procedures sql-server-2008-r2 rpc

我们有一个非常奇怪的问题:

我们有一个存储过程,它返回一组数据。此过程执行相当复杂的连接和聚合,因此执行需要700毫秒。

直接在SQL Studio中调用时,过程ALWAYS返回正确并始终需要大约700毫秒的时间。

然而,当通过客户端软件(C#或Excel)调用时,它会工作一段时间,但突然之间,该过程需要30秒(!)并且会超时。磁盘读取次数是正常的,但CPU正在上升。

此行为持续1-2小时,然后再次正常!在此期间,当过程显示此行为时,您仍可以在SQL Studio中执行该过程。此外,在客户端调用时,其他更简单的过程也会正常执行。

我用探查器检查了这些电话。通过客户端调用时,调用被标记为“RPC”,在SQL Studio中调用时,它是“SQL”

所以可能程序执行正常,但是通过RPC的数据传输不知怎的。但这只是猜测。

有没有人有想法,或者能指出我们某个方向?我不知道在哪里看。 事件日志也是空的。

2 个答案:

答案 0 :(得分:1)

问题解决了 - 这是一个相当复杂的功能,编译执行计划花了很多时间。我通过删除大量条件分支(if,case)并将过程分成多个子过程来简化过程。

答案 1 :(得分:0)

.NET应用程序使用预定义(默认)命令超时值。 对于某些命令和查询,此持续时间很可能不够。 您可以尝试在应用程序中定义自定义命令超时。

我认为您使用的是C#应用程序。在数据库上下文的构造函数中定义(EF代码优先方法)可能会解决您的问题。

public MyDBContext()
      : base("MyDB")
  {
      ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;
  }

我一直在基于C#的应用程序中使用此定义以及执行sql server存储过程的EF。

祝你好运!