【问题标题】:Stored procedure is taking time to execute causing timeout exception in .net存储过程需要时间来执行导致 .net 中的超时异常
【发布时间】:2012-08-26 00:05:18
【问题描述】:

我们希望对提供的范围内所有日期的金额求和。

逻辑就像 - 在 while 循环中,我们将日期范围的金额列的总和添加到另一个变量中

这需要 1-3 分钟才能执行,具体取决于日期范围。

因此,我们在代码端遇到超时异常。

我们是否可以在存储过程中进行更改以减少时间,或者是否有任何其他方法可以在代码中处理此问题,以便不会引发异常。

请帮忙...

【问题讨论】:

  • 改进存储过程是必经之路。
  • Sum 也适用于set-based approaches,你为什么要使用 while 循环?
  • 分享您用于此目的的 SQL 查询!
  • 我在想象一个光标和几个变量...

标签: .net sql


【解决方案1】:

调整查询性能的各种方法包括:

  • 重写查询

没有一种方法可以编写查询。如果您发现使用 OUTER JOIN 的查询需要很长时间,请使用 INNER JOIN 重写它。或者,WHERE 子句的编写方式可能会导致过多的数据库读取操作。

  • 规范化或反规范化表

虽然规范化表会产生理想的数据库设计,但它通常会导致查询不佳。如果您发现经常使用的查询必须跨越太多规范化表,请考虑一些数据重复。

  • 添加索引

缺乏明确定义的索引是查询需要很长时间才能执行的常见原因。创建索引将导致查询查找索引而不是表。

  • 删除索引。 在某些情况下,导致查询执行缓慢的原因是定义不明确的索引。例如,不包含表中经常查找的列的索引。在这种情况下,最好删除索引并重新创建它。

从激活存储过程中的查询执行时间开始,看看需要什么时间

设置统计时间 从......中选择*

您还可以通过以下方式查看查询的图形执行计划: 点击查询 > 包括实际执行计划。

您可以阅读更多关于查询性能调整的信息:Pinal Dave's Blog,在这方面他是最好的。

【讨论】:

    【解决方案2】:

    正确的方法是优化你的程序,但由于你没有发布代码,我不能说什么,另一种方法是处理症状,这样就不会通过增加 Connectionstring 中的 Timeout 来抛出异常喜欢:

    "CommandTimeout = try any greater value;"
    

    【讨论】:

    • 明确一点,这个选项应该只是最后的手段。如果存储过程的性能如此糟糕以至于您需要这样做,那么它只会随着时间的推移而变得更糟,除非没有人真正在数据库中添加/更新数据。
    • @ChaosPandion 你只是重复了我在回答中提到的内容,无论如何我同意。
    • 我在字里行间阅读以了解您的意思,但您的实际答案不够清晰。
    • @ChaosPandion “正确的做法”和“处理症状”有什么不清楚的地方?无论如何,如果它让您感觉更好,欢迎您编辑答案,我可以接受。
    • 嗯,主要问题是您指定了连接超时。这实际上无助于避免超时异常。 stackoverflow.com/questions/847264/…
    【解决方案3】:

    如果您的查询确实需要这么长的时间,您可以通过将 SqlCommand 的 CommandTimeout property 设置为适当的值来防止超时。

    但首先要检查查询是否可以优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多