2009-05-06 67 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。