[firebase-br] Procedure selecionável muito, mas muuuiiitooo lenta.

Leonardo Vinicius Freitag freitagnx em gmail.com
Qua Jan 16 19:09:35 -03 2008


Olá pessoal!

Estou com um problema bem sério em relação à seguinte procedure:


CREATE PROCEDURE REL_VENDAGARCOM (
    ICOD_FUNC VARCHAR(20),
    IDESDE DATE,
    IATE DATE)
RETURNS (
    OCODIGO INTEGER,
    ONRO_CAIXA INTEGER,
    ODATA_ABRE DATE,
    OCODIGO_MESA INTEGER,
    OVALOR_VENDA NUMERIC(15,2),
    OCOD_ATENDENTE INTEGER,
    ONOME_ATENDENTE VARCHAR(50),
    ODINHEIRO NUMERIC(15,2),
    OCHEQUE NUMERIC(15,2),
    OCARTAO NUMERIC(15,2),
    OTICKETS NUMERIC(15,2),
    OCONTRA_VALE NUMERIC(15,2),
    OPENDURA NUMERIC(15,2),
    OFUNCIONARIO NUMERIC(15,2),
    OCORTESIA NUMERIC(15,2),
    OCONVENIO NUMERIC(15,2),
    OTOTAL_VISTA NUMERIC(15,2),
    OTOTAL_PRAZO NUMERIC(15,2),
    OTOTAL_RECEBIDO NUMERIC(15,2),
    OPER_VISTA NUMERIC(15,2),
    OPER_PRAZO NUMERIC(15,2),
    OVAL_COM_VISTA NUMERIC(15,2),
    OVAL_COM_PRAZO NUMERIC(15,2))
AS
begin
if (ICOD_FUNC IS NULL) then ICOD_FUNC = '%';
-- SELEÇÃO APARTIR DAS VENDAS A VISTA
FOR SELECT ABERT_CAIXA.CODIGO, ABERT_CAIXA.NRO_CAIXA, ABERT_CAIXA.DATA_ABRE,
           AC_MESAS_ABERTAS.CODIGO, AC_MESAS_ITENS.TOTAL,
AC_MESAS_ITENS.COD_ATENDENTE,
           AC_MESAS_ITENS.ATENDENTE, AC_RECEBIMENTO.DINHEIRO_R,
AC_RECEBIMENTO.CHEQUE,
           AC_RECEBIMENTO.CARTAO, AC_RECEBIMENTO.TICKETS,
AC_RECEBIMENTO.CONTRA_VALE,
           AC_RECEBIMENTO.PENDURA, AC_RECEBIMENTO.FUNCIONARIO,
AC_RECEBIMENTO.CORTESIA,
           AC_RECEBIMENTO.CONVENIO
    FROM (((((ABERT_CAIXA JOIN AC_MESAS_ABERTAS ON ABERT_CAIXA.CODIGO =
AC_MESAS_ABERTAS.COD_CAIXA)
                          JOIN AC_MESAS_ITENS ON AC_MESAS_ABERTAS.CODIGO =
AC_MESAS_ITENS.COD_MESAS_ABERTAS)
                          JOIN AC_RECEBIMENTO ON AC_MESAS_ABERTAS.CODIGO =
AC_RECEBIMENTO.COD_REGISTRO)
                          JOIN ESTOQUE ON AC_MESAS_ITENS.COD_PRODUTO =
ESTOQUE.COD_ESTOQUE)
                          JOIN FUNCIONARIOS ON AC_MESAS_ITENS.COD_ATENDENTE
= FUNCIONARIOS.COD_FUNC)
    WHERE FUNCIONARIOS.COD_FUNC LIKE :ICOD_FUNC
    AND ABERT_CAIXA.DATA_ABRE BETWEEN :IDESDE AND :IATE
    AND ESTOQUE.COMISSIONADO = 'S'
    AND AC_RECEBIMENTO.TIPO =  'M'
    AND FUNCIONARIOS.CARGO = 'GARCOM'
    INTO :OCODIGO, :ONRO_CAIXA, :ODATA_ABRE, :OCODIGO_MESA, :OVALOR_VENDA,
         :OCOD_ATENDENTE, :ONOME_ATENDENTE, :ODINHEIRO, :OCHEQUE, :OCARTAO,
         :OTICKETS, :OCONTRA_VALE, :OPENDURA, :OFUNCIONARIO, :OCORTESIA,
         :OCONVENIO
    DO
  BEGIN
    OPER_PRAZO = 0;
    OPER_VISTA = 0;
    OVAL_COM_PRAZO = 0;
    OVAL_COM_VISTA = 0;
    OTOTAL_VISTA = :ODINHEIRO+
                   :OCHEQUE+
                   :OCARTAO+
                   :OTICKETS+
                   :OCONTRA_VALE+
                   :OCONVENIO;
    OTOTAL_PRAZO = :OPENDURA;
    OTOTAL_RECEBIDO = :OTOTAL_VISTA + :OTOTAL_PRAZO;
    if (:OTOTAL_VISTA > 0) then OPER_VISTA = (:OTOTAL_VISTA /
:OTOTAL_RECEBIDO)*100;
    if (:OTOTAL_PRAZO > 0) then OPER_PRAZO = (:OTOTAL_PRAZO /
:OTOTAL_RECEBIDO)*100;
    if (:OPER_VISTA > 0) then OVAL_COM_VISTA = (:OVALOR_VENDA *
:OPER_VISTA)/100;
    if (:OPER_PRAZO > 0) then OVAL_COM_PRAZO = (:OVALOR_VENDA *
:OPER_PRAZO)/100;
    suspend;
  END
end

O problema é que os relatórios têm demorado até 20 minutos para aparecer.
Além tem alguma idéia sobre modificações ou algo que possa melhorar o
desempenho da procedure.
O servidor é um intel parrudão bem dimensionado, mas roda com windows xp.

Atencipadamente grato,

Leonardo Vinicius Freitag



Mais detalhes sobre a lista de discussão lista