【问题标题】:Set query timeout in T-SQL在 T-SQL 中设置查询超时
【发布时间】:2017-06-29 01:30:39
【问题描述】:

我正在从应用程序对 SQL Server 执行查询。有时其中一个查询会持续很长时间。实际上太长,它通常表明它最终会失败。我想指定一个最长持续时间,在此之后查询应该会失败。

有没有办法指定命令超时在 T-SQL 中?

我知道可以在连接字符串中设置(连接和)命令超时。但在这个应用程序中,我无法控制连接字符串。即使我可以,其他查询也应该更长。

【问题讨论】:

  • 这是一个非常好的线程。我喜欢 sp_WhoIsActive 和一些 sys 函数来查看长查询。当然,您必须经常运行查询以查看您的阈值是否达到然后将其终止。 dba.stackexchange.com/questions/66249/…
  • 我在数据库中不是管理员,所以我无法终止查询。
  • 你也不能在连接字符串中设置。这只是连接超时。

标签: sql-server tsql timeout


【解决方案1】:

据我所知,您无法限制查询时间,除非在连接字符串中指定(您不能这样做)或者查询是通过链接服务器执行的。

【讨论】:

  • 我很害怕。如果它通过链接服务器怎么办?
  • 如果它在链接服务器上,您可以为远程查询设置目标服务器的超时限制,这将适用于所有查询。这是一个不可取的解决方案,原因有很多,其中之一是能够生成适当的执行计划。
【解决方案2】:

您的 DBA 可以为链接服务器以及查询设置超时,但直接查询不允许您自己这样做。我会有更大的问题是为什么查询失败?服务器上是否已经存在预设超时(希望如此),您是否内存不足和分页不足,或者其他一百万个原因。你有DBA吗?因为如果我的一台服务器被这样糟糕的代码所攻击,我会联系执行它的人。如果他没有,您应该联系并寻求帮助确定失败原因。

【讨论】:

  • 查询的执行是经过深思熟虑的,我不确定您为什么认为任何代码都会出错。问题是延迟很少发生(而且在晚上),所以我们不知道去哪里找。我只是在寻找突破的方法。
【解决方案3】:

如果意外的长持续时间恰好是由于(本地)锁定,有一种方法可以打破它。在运行查询之前设置锁定超时:

SET LOCK_TIMEOUT 600000 -- Wait 10 minutes max to get the lock.

之后不要忘记将其重新设置,以防止对连接的后续查询超时:

SET LOCK_TIMEOUT -1 -- Wait indefinitely again.

【讨论】:

    猜你喜欢
    • 2012-12-05
    • 2011-05-21
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多