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

Sql server 是否可以在Microsoft SQL Server上为SQL查询设置超时?,sql-server,timeout,Sql Server,Timeout,我有一个场景,有时用户选择正确的参数并进行一个需要几分钟或更长时间才能执行的查询。我不能阻止他选择这样的参数组合(这是合法的),所以我想在查询上设置一个超时 请注意,我确实希望停止查询执行本身并回滚任何事务,因为否则它会占用大部分服务器资源。添加一个不耐烦的用户,重新启动应用程序并再次尝试组合,您就得到了一个灾难的配方(读:SQL Server DoS) 可以这样做吗?如何做?当连接到数据库时,可以在SQL连接字符串中指定连接超时,如下所示: "Data Source=localhos

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

请注意,我确实希望停止查询执行本身并回滚任何事务,因为否则它会占用大部分服务器资源。添加一个不耐烦的用户,重新启动应用程序并再次尝试组合,您就得到了一个灾难的配方(读:SQL Server DoS)


可以这样做吗?如何做?

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

"Data Source=localhost;Initial Catalog=database;Connect Timeout=15"
在服务器级别,使用MSSQLSMS查看服务器属性,并在连接页面上指定默认查询超时

我不太确定在客户端连接关闭后查询是否继续运行。查询也不应该花那么长的时间,MSSQL可以处理大型数据库,我以前使用过GB的数据。对查询运行一个性能概要文件,预捕获一些位置合适的索引可以加快查询速度,或者重写查询也可以加快速度

更新: ,在等待服务器的注意确认时发生SQL超时:

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


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

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


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

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

您确实可以使用更改默认的600秒,但这些都是服务器范围。

哼! 您是否尝试过锁定\u超时
在运行查询之前记下最初的内容
为您的查询设置它
运行查询后,将其设置回原始值

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

我可以建议两件事

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

只需在所有表引用中使用(NOLOCK)从表中添加
Select*,即可防止查询阻塞并发事务

2) 如果你想确保你所有的查询都在(比方说)5秒内运行,那么你可以添加@talha建议的内容,这对我来说很好

只需在执行的顶部添加

SET LOCK_TIMEOUT 5000;   --5 seconds.
这将导致您的查询耗时少于5秒或失败。然后,您应该捕获异常并在需要时回滚


希望有帮助。

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


< P>这听起来更像是一个建筑问题,你可以做的任何超时/中断都或多或少是一个创可贴。必须在SQL server端通过只读副本、事务日志传送(为您提供一个要连接的只读服务器)、复制等方式解决这一问题。基本上,您为DMZ sql server提供了一个可以在不破坏内容的情况下进行大量读取的功能。这是很常见的。一个设计良好的SQL系统不会被DDoS摧毁——这就像一辆汽车,如果你踩到油门就会死亡

也就是说,如果您可以随意更改代码,您可以猜测查询是否太重,并且可以拒绝或只返回存储过程中的X行。如果您与某个报告工具等匹配,并且无法控制它生成的选择,则可以将其指向视图,然后在视图中执行安全阀

此外,如果最新的新鲜度并不重要,您可以在这方面做出妥协,比如每月的销售数据,那么按作业编译复杂联接的物理表以避免复杂联接可能会起到关键作用—这样,每个查询的时间都将是亚秒

这完全取决于你在做什么,但总有解决办法。有时需要额外的编码来优化它,有时需要额外的钱来获得辅助只读数据库,有时需要时间和注意力来调整索引

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


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

您有什么原因不能在连接对象上的代码中设置此超时?@Oded-因为我希望它在服务器级别,而不是客户端。我可以在客户端连接上设置它,但这只会终止我的连接。查询将继续在服务器上执行,直到完成为止。据我所知,无法逐个查询执行此操作
sp_configure
允许设置超时,但我相信它们是服务器范围内的。@Oded-这是不可更改的