2009-05-06 75 views
2

我希望能够中止一个特​​定的SQL语句,如果它需要超过指定的秒数。我怎样才能做到这一点?可以在给定的时间范围内中止特定的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秒。

回答

3

通常,在发出SQL语句的命令上设置超时。如果以C#为例,则设置IDbCommand.CommandTimeout属性,如果语句尚未完成,它将在超时到期后引发SQLException。这将会回滚任何事务。

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

重点是 - 看看运行语句的东西,而不是实际的语句本身。

0

其中一种可能性是您可以监控所有活动连接并杀死任何超时时间活动的连接。

虽然我从来没有做过这样的事情。

1

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

使用查询调控成本极限 选项上 指定上限的时间段,其中查询可以 运行。查询成本指 需要完成 特定硬件配置的估计经过时间(秒) 。

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

如果使用sp_configure更改查询控制器成本限制 值 更改后的值为服务器范围。若要 基于每个连接的更改值,请使用SET QUERY_GOVERNOR_COST_LIMIT语句。

查询调控器成本限制选项 是一个高级选项。如果你使用存储过程 更改设置sp_configure系统是 ,你 可以更改查询调控器成本限制 只有在show advanced options设置 为1的设置生效 立即(无服务器 重启)。

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。