【问题标题】:Is there any negative effect to setting SqlCommand's CommandTimeout to a high value?将 SqlCommand 的 CommandTimeout 设置为高值有什么负面影响吗?
【发布时间】:2015-11-24 02:20:50
【问题描述】:

当存储过程花费的时间超过默认超时值时,我似乎遇到了一些随机问题;我被告知here。

所以我增加了价值,它似乎有所帮助。

但这让我想知道:为什么不总是把它设为一个非常高的数字,以防查询或操作需要很长时间?不是因为这是允许的 MAX 就需要那么长时间,对吧?

既然如此(我想),为什么默认值会这么低(我相信是 30 秒)?

更新

我最初将 SqlCommand 的 CommandTimeout 值设置为 300(5 分钟),但这样我得到了“发生上下文切换死锁”。所以我把它减少到 120(2 分钟),这对我来说似乎或多或少是“甜蜜点”。在几次测试中,我确实有一次“超时已过期”,但是当我重试相同的确切范围时,它第二次成功完成,所以我想这只是“其中之一” - 120 有时还不够超时,但 300 显然太多了。 IOW,这种太少和太多之间的平衡行为似乎不是“一门精确的科学”。

【问题讨论】:

  • 另外,如果出现问题并导致查询运行时间比正常时间长,并且您增加了超时时间,您将获得更多内存争用、锁定等问题,这可能会使事情变得更糟。
  • 如果查询锁定任何表,我们将超时设置为短(持续时间有意义)是很正常的。

标签: c# sql-server sqlcommand command-timeout


【解决方案1】:

超时只会限制您等待的最大值。它不会让快速的事情花费更长的时间。

有时您无能为力,而一个功能就是荒谬的,并且需要很长的时间。在这种情况下,只需要更长的超时时间。

但是,希望并非总是如此,因为用户通常不想等待很长时间。而且如果用户停止等待,那么您可能会浪费资源创建不会被使用的东西。此外,您也可能让用户等待,如果他们不小心选择了超出预期的操作。

我的建议是保持合理的超时,并且只在必要的有限场景中延长它们。

在一个完全不同的主题上,人们可能能够更改功能以使其运行得更快(例如过滤以处理更少的数据、预聚合可以更快处理的中间总计、索引和/或查询优化.) 有时索引可能是 2 分钟和 2 秒之间的差异。

【讨论】:

  • 是的,我意识到增加超时并不能加快速度;但在某个时刻(我是 300),我得到了“发生上下文切换死锁”。把它减少到120,我不再明白了。在这个实用程序中,让用户等待的是他们使用该实用程序的唯一需要。他们会等待,否则他们无能为力。我几乎无法控制速度,因为它是返回数据的预先存在的存储过程。
  • 说到 ContextSwitchDeadlock,您可能会对以下链接感兴趣:stackoverflow.com/questions/578357/…
  • 我希望不会,因为大家都出去了。
  • 感谢您的链接;我遵循了答案,并期待着奇妙的结果;既然你要关闭它是一个“调试”的东西,这是否意味着用户(运行 .exe 的发布版本)无论如何都不会看到它(你知道吗)?
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
相关资源
最近更新 更多