[firebase-br] Procedure Lenta

Daniel Fernandes daniel em agriness.com
Ter Fev 9 14:32:26 -03 2010


Olá Professores,
Gostaria de saber qual a forma mais eficaz de otimizar uma Procedure? (além
de criar índices para as tabelas, se tem alguma outra forma).
É que tenho uma procedure que atualiza os custos de material, mas ela é
muito lenta (talvez porque a tabela tenha mais de 15000 registros). Abaixo
está o código da procedure, apenas para ter uma idéia do que ela faz:

BEGIN
    FOR EXECUTE STATEMENT
        ' SELECT A.cdAuto, A.cdMaterial AS cdProduto, A.qtEstoqueDia, ' ||
        '  A.qtCompra, A.vlUnitarioCompra, A.dtLancamento ' ||
        '  FROM auxEstoqueCustoMaterial AS A ' ||
        '  ORDER BY A.cdAuto '
        INTO :v_cdAuto, :v_cdProduto, :v_qtEstoqueDia,
             :v_qtCompra, :v_vlUnitarioCompra, :v_dtlancamento
    DO
    BEGIN
        /* zera os campos quando alterar o produto */
        if (v_cdProduto <> v_cdprodutoant) then
        begin
            v_cdprodutoant = v_cdproduto;
            v_qtestoqueatual = 0;
            v_vlcustoatual = 0;
        end

        /* Calcula o custo atual */
        if (v_qtCompra > 0) then
        begin
            if (v_qtEstoqueAtual > 0) then
            begin
               v_vlCustoAtual = Round(((v_qtCompra*v_vlUnitarioCompra) +
(v_qtEstoqueAtual*v_vlCustoAtual))
                                   / (v_qtCompra+v_qtEstoqueAtual),4);
            end
            else
                v_vlCustoAtual =
Round((v_qtCompra*v_vlUnitarioCompra)/v_qtCompra,4);
        end

        /* Calcula o estoque atual */
        v_qtEstoqueAtual = Round(v_qtEstoqueAtual + v_qtEstoqueDia,4);

        /* Atualiza os valores da tabela auxiliar */
        EXECUTE STATEMENT
            ' UPDATE auxEstoqueCustoMaterial AS B  ' ||
            ' SET B.qtEstoqueAtual = ' || :v_qtEstoqueAtual || ',  ' ||
            '     B.vlCustoAtual =  ' || :v_vlCustoAtual  || '' ||
            ' WHERE B.cdAuto = ' || :v_cdauto;

        /* Atualiza os valores da tabela oficial */
       EXECUTE STATEMENT
            ' UPDATE eparLancamentoMaterial AS MP  ' ||
            ' SET MP.vlCustoAtual = ' || :v_vlCustoAtual  || '' ||
            ' WHERE MP.cdMaterial = ' || :v_cdproduto ||
            ' AND MP.dtLancamento = ''' ||  :v_dtlancamento ||  '''';

    END

END






Mais detalhes sobre a lista de discussão lista