我可以在给定的时间跨度后中止特定的sql语句吗?

时间:2009-05-06 09:00:36

标签: sql timeout

如果需要的时间超过指定的秒数,我希望能够中止特定的sql语句。我怎样才能做到这一点?

例如,我想做类似的事情:


SET NextStatementTimeOutSeconds = 60
SELECT * FROM MyTable
IF @@LastStatementTimedOut = 1
    PRINT 'Statement timed out after 60 seconds'
ELSE
    PRINT 'Statement completed in less than 60 seconds'

请注意,我制作了NextStatementTimeOutSeconds@@LastStatementTimedOut以说明我想要做的事情。


感谢您的建议。我正在考虑在单个sql脚本/批处理中使用这样的超时,如果可能的话。

背景:我们有几个存储过程,我希望比X秒快。所以我会一个接一个地打电话给他们;如果一个时间超过X秒,我就会中止并打印一个类似'sproc 13花费太长时间'的声明。数据变化,我正在尝试不同的索引更改,所以我想在这些更改后对所有sprocs进行时间测试,以确保它们都低于X秒。

4 个答案:

答案 0 :(得分:3)

通常,在发出SQL语句的命令上设置超时。例如,如果那是在C#中,则设置IDbCommand.CommandTimeout属性,如果语句尚未完成,它将在超时到期后抛出SQLException。然后,这将回滚任何交易。

在SQL Server上的计划任务中,我希望在配置作业时,某个位置的向上/向下控件中会有一个值,允许您更改作业的超时。我认为SQL Server中的术语是“执行超时”但我不知道如何设置它我害怕。

重点是 - 查看运行语句的内容,而不是实际的语句本身。

答案 1 :(得分:1)

您可以使用query governor来限制查询的运行时间。下行是,它是影响针对特定数据库启动的所有查询的全局选项。

  

使用查询调控器成本限制   指定上限的选项   查询可以的时间段   跑。查询成本是指   估计的经过时间,以秒为单位,   需要完成一个查询   具体的硬件配置。

     

如果指定非零,非负   值,查询调控器不允许   执行任何具有的查询   估计成本超过该值。   为此指定0(默认值)   选项关闭查询调控器,   并且允许所有查询运行   没有任何时间限制。

     

如果使用sp_configure来更改   查询调控器成本限制的值,   更改的值是服务器范围的。至   更改每个连接的值   基础,使用SET   QUERY_GOVERNOR_COST_LIMIT语句。

     

查询调控器成本限制选项   是一个高级选项。如果你是   使用存储的sp_configure系统   你改变设置的程序   可以更改查询调控器成本限制   仅在设置了显示高级选项时   到1.设置生效   立即(没有服务器   重新启动)。

答案 2 :(得分:1)

如果您使用的是SQL Server,则可以将链接服务器添加到运行查询的数据库中。您可以为链接服务器设置超时,如:

EXEC master.dbo.sp_serveroption @server=N'linkedserver', 
    @optname=N'query timeout', @optvalue=N'1'

然后您可以运行查询:

select * from openquery(linkedserver,'select * from ...')

您可以使用TRY...CATCH块在发生超时时捕获超时:

begin try
select * from openquery(linkedserver,'select * from ...')
end try
begin catch 
print @@error
end catch

对于“查询超时已过期”,@@错误将为7320。

答案 3 :(得分:0)

一种可能是您可以监控所有活动连接并终止任何对超时有效的连接。

我以前从未做过类似的事情。