如何优化一个大脚本

时间:2013-05-29 12:53:55

标签: sql tsql stored-procedures

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

如果我要单独创建该函数而不是使用一个调用这些过程的大脚本,那么它会显着提高性能吗?

有任何建议进入这个?或者如何优化这种程序?

修改

与我的这个问题有些相关,在执行的程序中,我找到了ff:Concer

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'

正如我在这里问SO

我希望就如何优化它提出建议,是否有更好的做法,例如定义一个表然后是字段,只需查询一次大时间选择等等。

如果有人也可以给我一个很好的选择,如何摆脱下一次或同时取,请这样做。

1 个答案:

答案 0 :(得分:0)

正如Rory Hunter所说,你不要在你的光标前进。

呼叫

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

再次作为循环中的最后一个语句,否则会得到无限循环