【问题标题】:Performance issues with a stored proc - closing a connection too slow存储过程的性能问题 - 关闭连接太慢
【发布时间】:2013-12-31 09:33:13
【问题描述】:

我之前曾向question 询问过一个在 sql server 机器上执行速度太慢的存储过程,但是,如果我在查询分析器中运行存储过程,它会在一秒钟内返回。客户端是一个 .NET 1.1 winforms 应用程序。

我能够将 VNC 输入到用户的盒子中,当然,他们没有安装 SQL 工具,所以我启动了 Excel,进入 VBA 并编写了一个快速函数来调用具有完全相同参数的存储过程。

事实证明,存储过程确实返回亚秒级,我可以立即循环遍历所有行。但是,关闭连接需要很长时间,从 5 秒到 30 秒不等。

为什么关闭连接需要这么长时间?

【问题讨论】:

  • 我们发现了问题。由于电池没电了,本地 IT 禁用了 RAID 阵列上的读/写缓存。不要问我为什么 RAID 阵列是靠电池运行的。
  • 电池用于将 RAID 控制器的缓存保存在内存中。这样,如果在写入过程中断电,RAID 控制器会保留需要写入磁盘的数据,从而保证您的阵列安全。当电池没电时,缓存将被禁用。

标签: performance sql-server-2005 connection


【解决方案1】:

您描述的症状几乎总是由于“不正确”的缓存查询计划造成的。虽然这是一个很大的话题(请参阅 SO 上的parameter sniffing),但您通常可以(但不总是)通过重建数据库的索引并确保所有统计信息都是最新的来缓解问题。

【讨论】:

  • 我消除了参数嗅探可能是罪魁祸首。不是它。我还重建了索引并使用全扫描进行了完整的更新统计。请注意,数据会很快返回。连接需要永远关闭。
  • @AngryHacker:当你说'关闭连接'时,你是说它被返回到连接池吗?你能发布一些给出这种行为的示例代码吗?
  • 问题已解决(请参阅我对 OQ 的评论)。但是,我学到的是,当您关闭连接 (conn.Close) ,但没有遍历行时,该方法实际上会在实际关闭连接之前将所有行带到客户端。
【解决方案2】:

如果您使用的是 SqlDataReader,您可以尝试的一件事是,一旦您拥有所需的所有数据,请先在 SqlCommand 上调用 Cancel,然后再在 SqkDataReader 上调用 Close。这将防止填写输出参数和返回值,这可能是关闭连接缓慢的原因。在 try catch 块中执行此操作,因为它可能引发用户取消的异常。

【讨论】:

    【解决方案3】:

    连接池?

    那个,或者我会检查客户端库的任何服务包或知识库文章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 2021-02-10
      相关资源
      最近更新 更多