0

SQLは以下のプロセスをどのように実行しますか; SSMSで実行しようとすると、アイテムごとに約15秒かかりますが、SQLエージェントジョブに入れると、出力を得るのにほぼ一生かかります。

ForProcessing is a list of items

OPEN ForProcessing
FETCH NEXT FROM ForProcessing into @HeaderID, @CompanyCode, @AssignedCompanyID, @BranchCode, @WorkDate
WHILE @@FETCH_STATUS = 0
BEGIN

    -- EOD for S1 FILE (MMS FILE)
    if exists (select 1 from mMiddlewareFiles where cType = 'O' and cVersion = @cVersion and cFile = 'S1FILE')
    BEGIN
        execute rmw_eod_S1_file @HeaderID, @AssignedCompanyID, @BranchCode, @WorkDate
    END
    -- EOD for SL FILE (CSA FILE)
    if exists (select 1 from mMiddlewareFiles where cType = 'O' and cVersion = @cVersion and cFile = 'SLFILE')
    BEGIN
        execute rmw_eod_SL_file @HeaderID, @AssignedCompanyID, @BranchCode, @WorkDate
    END
    -- EOD for C FILE (CSA FILE)
    if exists (select 1 from mMiddlewareFiles where cType = 'O' and cVersion = @cVersion and cFile = 'CFILE')
    BEGIN
        execute rmw_eod_C_file @HeaderID, @AssignedCompanyID, @BranchCode, @WorkDate
    END

    FETCH NEXT FROM ForProcessing into @HeaderID, @CompanyCode, @AssignedCompanyID, @BranchCode, @WorkDate
END

これらのプロシージャを呼び出す 1 つの大きなスクリプトを作成する代わりに、関数を個別に作成すると、パフォーマンスが大幅に向上しますか?

これに入るためのアドバイスはありますか?または、この種の手順を最適化する方法は?

編集:

私のこの問題に多少関連していますが、実行されたプロシージャ内で ff: 懸念が見つかりました

DECLARE @a, @b, @c, @d, @e, etc... --the list grows 
SELECT @a = field2 from Parameters where field1 = 'UserName'
SELECT @b = field2 from Parameters where field1 = 'Name'
SELECT @c = field2 from Parameters where field1 = 'CompanyCode'
SELECT @d = field2 from Parameters where field1 = 'MachineNo'
SELECT @e = field2 from Parameters where field1 = 'Type'

私がここで尋ねたよう

それを最適化する方法についてアドバイスをお願いします。テーブルを定義してからフィールドを定義し、1回の大きな時間の選択などを照会するなど、これを行う方が良いでしょうか..

誰かが次またはその間にフェッチから逃れるための良い代替手段を教えてくれるなら、そうしてください。

4

1 に答える 1

0

Rory Hunter が言ったように、カーソルは進みません。

電話

FETCH NEXT FROM ForProcessing into @HeaderID, @CompanyCode, @AssignedCompanyID, @BranchCode, @WorkDate

再びループの最後のステートメントとして、そうしないと無限ループが発生します

于 2013-05-29T12:57:40.083 に答える