【问题标题】:Unexplained timeouts when running stored procedures运行存储过程时出现无法解释的超时
【发布时间】:2014-01-13 07:54:40
【问题描述】:

背景 - 我有一个网站和一个 Windows 计划作业,它们是 MSI 的一部分并安装在同一台服务器上。最终用户使用该网站来创建一些规则,并且计划每天运行该作业,以便为最终用户创建的规则创建平面文件。实际情况比上面解释的要复杂得多。

问题(与网站有关) - 网站大部分时间都运行良好,但有时它只是无法加载规则创建页面 - 异常被记录为“查询超时或 SQL”服务器没有响应'

问题(作业) - 作业的行为与网站一样,但有时会失败,但出现异常 - “查询超时或 SQL 服务器无响应”

我试过的 -

  • 我已将“连接超时”添加到 SQL 连接字符串 - 似乎对记录没有帮助 - 这会告诉我这是 SQL 连接超时还是查询超时。
  • 我还运行了由网站和作业调用的存储过程 - 并且 所有 存储过程在业务定义的 3600 秒超时内很好地完成。存储过程实际上在一分钟内完成。
  • 我还运行了 SQL 分析器 - 但 TRACES 也没有帮助我 - 虽然我可以看到很多事务,但我无法证明服务器有问题。

我所寻求的 - 还有其他可能导致此问题的原因吗?有什么可以找的吗?

技术 - SQL Server 2008 R2、ASP.Net、C#.Net

限制 - 由于客户机密性,无法透露代码详细信息,但我愿意接受问题 - 我会在考虑客户机密的情况下尝试回答这些问题。

注意 - 已经有查询超时(3600s)&连接超时 (30s) 在应用程序配置文件中定义。

【问题讨论】:

  • 在不了解 MS SQL 的情况下:我建议增加日志记录的详细程度并监控此行为。
  • 查询/作业是否有特定的时间很慢,或者是随机的?顺便说一句,上面确实没有足够的信息可供参考。如果您可以发布部分代码并删除业务逻辑或机密内容,将会有所帮助。
  • @suyashKhandwe 检查您是否正确处理连接对象。
  • 你能澄清一下你是在谈论连接超时还是命令超时?问题暗示后者,标题暗示前者。如果是连接超时,请确保您的所有连接都被正确处理。如果是前者,您需要启动 ActivityMonitor
  • 回答上述 cmets 中的几个问题 - 1. 似乎是命令超时,因为网站/工作的某些部分工作正常。 2. 我确信连接被正确处理,因为我使用的是企业库并且不必手动管理连接。

标签: c# asp.net sql sql-server sql-server-2008-r2


【解决方案1】:

所以,我在这里和那里尝试了一些东西,并且能够找出根本原因 -

SQL 存储过程正在连接来自 2 个不同数据库的 2 个表 - 其中一个具有不同数量的记录 - 这些记录正在由不同的(第 3 方)作业更新/插入。由于第 3 方工作的时间和我的工作不同 - 由于表锁没有出现问题,但是当我的超时时间不够时,大量的记录导致我的工作超时。

但是,正如我所说,我已经给出了 3600 秒的业务标准命令超时 - 不知何故,企业库以其自己的默认命令超时 30 秒覆盖了我的自定义超时 - 因此 C# 代码部分甚至会抛出异常在存储过程完成执行之前。

我所做的 - 这可能对我们中的一些人有所帮助 -

  1. 我从项目中删除了企业库的引用
  2. 清理我的解决方案并检查到 SVN。
  3. 然后也清理了 SVN。
  4. 删除企业库引用后我没有构建应用程序 - 显然由于引用错误而无法构建。
  5. 之后,我进行了干净的结帐并再次添加了企业库。

现在它似乎可以处理不同数量的记录。

【讨论】:

    【解决方案2】:

    昨天也遇到了同样的问题。在 SQL Server 中有一个巨大的查询需要 18 秒,但在 C# 中甚至在 200 秒后就用完了。我重新启动了我的计算机,断开了数据库,甚至断开了服务器……没有任何改变。

    在阅读了一些主题之后,我注意到一个关于索引的常见提要。所以我在我的数据库中删除了一些索引,放回一些,瞧!恢复正常。

    这也许是我认为可能发生的事情。当我运行一些测试时,我可能还剩下一些僵尸连接,我的同事同时在数据库中创建了一些表,并将它们链接到我的存储过程中使用的表。即使新创建的表与存储过程无关,将它们与其他表链接起来似乎也弄乱了索引。为什么只有 C# 不能正常工作?我的猜测是,当直接连接 SQL Server 以外的其他地方时,SQL Server 中的内存缓存无法访问。

    注意在我的情况下,仅仅改变存储过程根本没有任何效果,即使它是某些线程中常见的“解决方案”。

    如果有人遇到同样的问题,希望这会有所帮助。如果有人能找到更好的解决方案/解释,请分享!!!

    干杯,

    【讨论】:

      【解决方案3】:

      我在使用 mssql 时遇到了类似的问题,但没有找到导致这种不稳定行为的任何特殊原因。我的解决方案是使用

      重新索引数据库

      sp_updatestats

      每小时一次。

      【讨论】:

      • 附带说明,如果您的数据库需要它的索引每小时重建一次,您应该认真查看您的填充因子!
      • 每小时重新索引数据库对于我们的服务器资源来说可能成本太高 - 我们处理大量数据(我说的是某些表中高达 1000 万行的数据)每小时索引这么多数据可能会减慢数据库速度
      【解决方案4】:

      您可以在存储过程定义中使用WITH RECOMPILE,以避免出现“查询超时或SQL Server 无响应”的错误

      这是微软的文章:
      http://technet.microsoft.com/en-us/library/ms190439.aspx

      另请参阅:
      SQL Server: Effects of using 'WITH RECOMPILE' in proc definition?

      示例代码:

      CREATE PROCEDURE [dbo].[sp_mystoredproc] (@param1 varchar(20) ,@param2  int)   
      WITH RECOMPILE   
      AS   
      ... proc code ...
      

      【讨论】:

      • 这不起作用 - 这背后的原因很可能是问题出在我的 C# 代码而不是 SQL 部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      相关资源
      最近更新 更多