【问题标题】:SQL Server runs very slow when called from .NET application从 .NET 应用程序调用 SQL Server 时运行速度非常慢
【发布时间】:2013-08-14 15:17:34
【问题描述】:

我在我的 ASP.NET 应用程序中使用 nHibernate 对存储过程进行了 SQL 调用:

GetNamedQuery("MyProc")
.SetString("param1", value1)
.SetString("param2", value2)
...

此处使用的 SQL Server 2005。它在我们的测试环境中运行良好,这个调用大约需要 2 秒才能完成。但是当我们将它移动到新服务器时,它开始需要很长时间,并且我的应用程序中出现超时异常。

但是,我在 SQL Server Profiler 中捕获调用,发现此调用运行了 30 秒。但是当我复制相同的查询并在服务器上运行它时,它会在 2 秒内完成。

那么问题是什么会影响来自 .NET 应用程序的工作查询?

【问题讨论】:

  • 你能发布你存储的过程代码吗?
  • 它是否缓存了执行计划,如果是,它在编译/缓存后是否会加速? - 将有助于查看所有调用代码方法和存储过程代码。
  • 你有没有调查过任何怀疑 nHibernate 方法/使用效率低下的地方?
  • 其他服务器是否比测试环境有更多的数据或更多的流量?

标签: sql sql-server nhibernate timeoutexception


【解决方案1】:

毫无疑问,此类问题最完整的解决方案是found here,这是最好的书面文章之一。 如果您正在将参数从外部应用程序传递到存储过程中,一个在 80% 的时间都有效的快速破解方法是本地化过程中的参数:

CREATE PROCEDURE sp_Test
@VarOne INT, @VarTwo INT
AS
BEGIN

DECLARE @VOne INT, @VTwo INT
SET @VOne = @VarOne
SET @VTwo = @VarTwo

/* Rest of code only uses @VOne and @VTwo for parameters */

END

不过,这是假设您的应用程序中有存储过程需要的参数(从您发布的简短的 sn-p 代码中可以看出)。否则,提供的链接还描述了一些其他疏忽,我强烈推荐任何人使用它来解决外部应用程序的性能问题。

【讨论】:

  • 谢谢,按照您描述的方式更新程序对我不起作用。将调查您提供的文章。
猜你喜欢
  • 2020-03-14
  • 2017-08-19
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 2017-05-27
  • 2013-06-16
  • 2011-03-22
  • 2011-01-24
相关资源
最近更新 更多