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

时间:2010-06-22 09:20:25

标签: sql-server timeout

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

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

可以这样做吗?

8 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

我可能会建议两件事。

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

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

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

只需在执行的顶部添加

SET LOCK_TIMEOUT 5000;   --5 seconds.

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

希望它有所帮助。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

在Management Studio中,您可以设置超时(以秒为单位)。 菜单工具 => 选项设置字段,然后确定

enter image description here

答案 5 :(得分:0)

这听起来像是一个体系结构问题,并且您可以做的任何超时/断开连接都会或多或少地产生创可贴。必须在SQL服务器端通过只读副本,事务日志传送(为您提供连接的只读服务器),复制等方式解决此问题。基本上,您可以为DMZ sql服务器提供大量读取而无需杀死它们。这很常见。精心设计的SQL系统不会被DDoS淘汰-就像您踩油门时会死掉的汽车一样。

也就是说,如果您愿意更改代码,则可以猜测查询是否太繁琐,并且可以拒绝或只返回存储过程中的X行。如果您使用了某些报表工具,并且无法控制它生成的SELECT,则可以将其指向一个视图,然后在该视图中进行安全阀操作。

此外,如果实时更新不是很关键,并且您可以在此方面进行折衷,例如按月销售数据,则可以按工作编译复杂联接的物理表以避免复杂联接可能会成功-这样,每个查询的时间将不到一秒。

这完全取决于您的工作,但是总有解决方案。有时需要额外的编码来对其进行优化,有时需要花费额外的金钱来获得二级只读DB,有时在索引调优时需要时间和精力。

这完全取决于情况,但我将从“我可以妥协什么?我可以改变什么?”开始。然后从那里去。

答案 6 :(得分:0)

enter image description here

您可以以秒为单位设置执行超时。

答案 7 :(得分:-2)

当您连接到数据库时,可以在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秒超时的特殊情况。在大多数情况下,你永远不会遇到这个,服务器通常对注意力数据包非常敏感,因为它们在网络层处理得非常低。

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