Fórum Procedure pouca performance #418569

15/06/2012

0

Galera eu tenho uma procedure que esta com a performance horrível, demorando 25 a 40s para trazer o resultado, eu queria melhor isso.

Eu tenho uma tabela de Estoque onde faço toda a manutenção do estoque, e tenho uma tabela de produtos onde é feita manutenção de preços, descrições, impostos, etc...

eu estou fazendo um select nos produtos e pegando o ultimo saldo do produto, mas esta muito lento. estou disponibilizando a procedure do firebird 2.5.


CREATE PROCEDURE SP_LISTA_ESTOQUE2 (
    strvalor varchar(100))
returns (
    prod_id integer,
    prod_ean varchar(14),
    prod_descricao varchar(80),
    prod_pco_varejo DValor,
    status varchar(8),
    prod_estoq_min numeric(9,3),
    prod_estoq_max numeric(9,3),
    estoque numeric(9,3),
    prod_cod_cfop varchar(60),
    prod_und_trib varchar(6))
as
declare variable est_saldo numeric(9,3);
BEGIN
    /* Consulta pelo Código  */
    FOR
        SELECT
            produtos.prod_id,
            produtos.prod_ean,
            produtos.prod_descricao,
            produtos.prod_valor_venda,
            case
                when produtos.status = A then ATIVO
            else
                INATIVO
            end as prod_status,
            produtos.prod_estoq_min,
            produtos.prod_estoq_max,
            produtos.prod_cod_cfop,
            produtos.prod_und_trib
        FROM
            PRODUTOS
        WHERE
            produtos.prod_descricao starting with :strvalor or
            produtos.prod_id starting with :strvalor
        ORDER BY 1

        INTO :prod_id,
             :prod_ean,
             :prod_descricao,
             :prod_pco_varejo,
             :status,
             :prod_estoq_min,
             :prod_estoq_max,
             :prod_cod_cfop,
             :prod_und_trib
    DO

    BEGIN
        ESTOQUE = 0;
       // NESTE LAÇO É QUE É TEM PERCA DE PERFORMACE

        for select
              coalesce(e1.estoq_atual,0)
            from estoque e1
            where e1.prod_id = :prod_id
            and e1.estoq_id  = (select
                                 max(e2.estoq_id)
                               from estoque e2
                               where e2.prod_id = e1.prod_id)
            into :est_saldo do
        begin

                ESTOQUE = est_saldo;
        end
        suspend;
    END
END
Sidney Abreu

Sidney Abreu

Responder

Posts

20/06/2012

William

Colega qual a quantidade de registros nas tabelas envolvidas?

Existe índices nas tabelas?
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar