[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