[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