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

Armando Boza armando.boza em gmail.com
Qui Jan 17 07:38:52 -03 2008


qual firebird vc usa? 2.0 ? 1.5?

bom, eu acho que o problema ta nos JOINS, experimenta ligar direto com a 
outra tabela ou usar o left join.

WHERE ABERT_CAIXA.CODIGO = AC_MESAS_ABERTAS.COD_CAIXA
AND continua com as outras

ja tive problemas com desempenho relativo ao join.
outra coisa, no começo da sp vc verifica o campo icod_func e se ele for null 
vc passa %, isso precisa ser assim mesmo? nao deveria passar o codigo do 
func obrigatoriamente?

----- Original Message ----- 
From: "Leonardo Vinicius Freitag" <freitagnx em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, January 16, 2008 7:09 PM
Subject: [firebase-br] Procedure selecionável muito, mas muuuiiitooo lenta.


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
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista