我有一个经常调用的存储过程,因为它用于检索帐户语句。实际的存储过程在MSSMS的查询窗口中大约需要10ms,并且工作得很好,但是SOMETIMES决定在我的VB6应用程序中超时(超时设置为120秒)。 SP在两个数据库之间连接表,一个包含当前事务(DB#1),另一个包含存档事务(DB#2)。使用'sp_who2',没有SPID似乎占用或阻塞系统。
这是我设置的SQL变量:
DECLARE @rtnRecs int;
strSQL = "EXEC spA_StatementData
@sAccountNr = '123abc',
@bIncludeHistory = 1,
@bShowAllTransactions = 1,
@iValidRecords = @rtnRecs OUTPUT"
我在VB6中使用的方法是:
rs.Open sql, con, adOpenStatic
其中rs是ADODB.Recordset,con是与数据库的连接。
这段代码很长一段时间,比如2个月,并且被几个运营商使用。然后它突然间,没有明显的原因,停止工作 - 但仍然在MSSMS中正常工作。 我正在强调VB6,因为这是问题首次出现的地方,但同样的事情发生在我的VB.net代码中。
需要注意的是,'@ bIncludeHistory'参数是将JOIN设置为存档数据库(DB#2)的条件。当'@bIncludeHistory'设置为0时,不会发生超时。
重置服务可以解决问题,但这只是最后的手段。 还有什么我可以尝试的吗? 感谢
答案 0 :(得分:0)
小心存储过程中的参数嗅探。试试这个
CREATE PROC spA_StatementData (
@sAccountNr VARCHAR(1000)
, @bIncludeHistory BIT
, ...
) AS
SET NOCOUNT ON
DECLARE @_sAccountNr VARCHAR(1000)
, @_bIncludeHistory BIT
, ...
--- prevent parameter sniffing
SELECT @_sAccountNr = @sAccountNr
, @_bIncludeHistory = @bIncludeHistory
, ...
--- use local @_sAccountNr, @_bIncludeHistory, etc. instead of parmeter variables
答案 1 :(得分:0)
同样的问题发生在我身上,我错过了STORE PROCEDURE中的以下代码
SET NOCOUNT ON
希望这会有所帮助。 确保您的SP拥有此代码。