是否可以在Microsoft SQL Server上为SQL查询设置超时?

loading...


5

我有一个场景,有时用户选择正确的参数并进行需要几分钟或更长时间才能执行的查询 . 我不能阻止他选择这样的参数组合(这是非常合法的),所以我想在查询上设置超时 .

请注意,我真的想要停止查询执行本身并回滚任何事务,否则它会占用大部分服务器资源 . 添加一个不耐烦的用户,他重新启动应用程序并再次尝试组合,并且你有一个灾难的配方(读取:sql server DoS) .

可以这样做,怎么做?

loading...

5回答

  • -1

    据我所知,除了在客户端设置命令或连接超时外,无法在服务器中按查询更改查询超时 .

    您确实可以使用sp_configure更改默认的600秒,但这些是服务器作用域 .


  • 2

    如果您只有一个查询,我不知道如何在T-SQL级别设置超时 .

    但是,如果在存储过程中有 a few queries (即将数据收集到临时表中),则可以使用 GETDATE()DATEDIFF() 和一些 INT 变量来控制执行时间,这些变量存储每个部分的执行时间 .


  • 0

    连接到数据库时,可以在SQL连接字符串中指定连接超时,如下所示:

    "Data Source=localhost;Initial Catalog=database;Connect Timeout=15"
    

    在服务器级别,使用MSSQLMS查看服务器属性,在Connections页面上,您可以指定默认查询超时 .

    在客户端连接关闭后,我不太确定查询是否继续运行 . 查询也不应该花那么长时间,MSSQL可以处理大型数据库,我之前使用过它的GB数据 . 在查询上运行性能配置文件,或许一些放置好的索引可以加快速度,或者也可以重写查询 .

    Update: According to this list,等待来自服务器的注意确认时发生SQL超时:

    假设您执行命令,那么命令超时 . 发生这种情况时,SqlClient驱动程序会向服务器发送一个特殊的8字节数据包,称为注意数据包 . 这告诉服务器停止执行当前命令 . 当我们发送注意包时,我们必须等待来自服务器的注意确认,这在理论上可能需要很长时间和时间 . 您还可以通过在异步SqlCommand对象上调用SqlCommand.Cancel来发送此数据包 . 这是一个我们使用5秒超时的特殊情况 . 在大多数情况下,您永远不会遇到这个,服务器通常对注意数据包非常敏感,因为它们在网络层中处理得非常低 .

    因此,似乎在客户端连接超时后,会向服务器发送一个信号以取消正在运行的查询 .


  • 6

    姆!你试过LOCK_TIMEOUT吗?
    在运行查询之前记下它的原始内容
    设置它为您的查询
    运行查询后,将其设置回原始值

    SET LOCK_TIMEOUT 1800;  
    SELECT @@LOCK_TIMEOUT AS [Lock Timeout];
    

  • 3

    我可能会建议两件事 .

    1)如果您的查询需要花费大量时间,因为它使用了几个可能涉及锁的表,一个非常快速的解决方案是使用“NoLock”提示运行查询 .

    只需在所有表引用中添加 Select * from YourTable WITH (NOLOCK) 即可阻止查询阻止并发事务 .

    2)如果你想确定你的所有查询都运行(假设说)不到5秒,那么你可以添加@talha提出的内容,这对我来说很有用

    只需在执行的顶部添加即可

    SET LOCK_TIMEOUT 5000;   --5 seconds.
    

    这将导致您的查询少于5或失败 . 然后,您应该捕获异常并在需要时回滚 .

    希望能帮助到你 .

评论

暂时没有评论!