2

我们有一个很奇怪的问题:

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

在 SQL Studio 中直接调用时,该过程总是返回正确的,并且总是需要大约 700 毫秒的时间。

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

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

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

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

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

4

2 回答 2

1

问题解决了——这是一个相当复杂的函数,编译执行计划需要很多时间。我通过删除许多条件分支(if、case)并将过程拆分为多个子过程来简化过程。

于 2013-10-18T13:10:29.973 回答
0

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

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

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

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

祝你好运!

于 2013-10-12T08:48:23.197 回答