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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在Microsoft SQL Server上为SQL查询设置超时?相关的知识,希望对你有一定的参考价值。

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

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

可以这样做,怎么做?

答案

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

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

另一答案

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

SET LOCK_TIMEOUT 1800;  
SELECT @@LOCK_TIMEOUT AS [Lock Timeout];  
另一答案

我可能会建议两件事。

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

只需在所有表引用中添加Select * from YourTable WITH (NOLOCK),这将阻止您的查询阻止并发事务。

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

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

SET LOCK_TIMEOUT 5000;   --5 seconds.

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

希望能帮助到你。

另一答案

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

但是,如果您在存储过程中有一些查询(即将数据收集到临时表中),您可以使用GETDATE()DATEDIFF()和一些INT变量来控制执行时间,从而存储每个部分的执行时间。

另一答案

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

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

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

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

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

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

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

以上是关于是否可以在Microsoft SQL Server上为SQL查询设置超时?的主要内容,如果未能解决你的问题,请参考以下文章

在 Kitura 中使用 Microsoft SQL Server

将 Microsoft SQL Server 中的数据读入 R

将新表列添加到 Microsoft SQL Server 中的特定序号位置

com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法使用安全套接字层(SSL)加密与 SQL Server

[08001] [Microsoft] [SQL Server Native Client 11.0] 命名管道提供程序:无法打开与SQL Server的连接

Microsoft SQL Server Reporting Services 2017注册表