2

口座明細書を取得するために使用されるため、非常に頻繁に呼び出されるストアド プロシージャがあります。実際のストアド プロシージャは、MSSMS のクエリ ウィンドウで約 10 ミリ秒かかり、通常は正常に動作しますが、私の VB6 アプリケーションでは SOMETIMES がタイムアウト (タイムアウトを 120 秒に設定) することにしました。SP は、現在のトランザクションを含むデータベース (DB #1) とアーカイブされたトランザクションを含むデータベース (DB #2) の 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 コードでも同じことが起こっています。

注意すべきことの 1 つは、「@bIncludeHistory」パラメーターが、JOIN をアーカイブ データベース (DB #2) に設定する条件であることです。「@bIncludeHistory」が 0 に設定されている場合、タイムアウトは発生しません。

サービスをリセットするとうまくいきますが、それは最後の手段です。他に試せることはありますか?ありがとう

4

2 に答える 2

0

同じ問題が発生しました。STORE PROCEDURE で次のコードを見逃していました

SET NOCOUNT ON

お役に立てれば。SPにこのコードがあることを確認してください。

于 2013-12-25T08:00:26.790 に答える
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
于 2013-01-30T15:31:48.220 に答える