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

Kleber Caneva kdcc em terra.com.br
Qui Jan 17 10:55:24 -03 2008


Experimente fazer como abaixo. .Apenas mudei os JOINs

Seria necessario um estudo sobre o metadata do banco, ver se está estão 
criadas as FKs, se está usando indices, etc..

[]´s

Kléber Caneva

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
  LEFT JOIN AC_MESAS_ABERTAS ON (ABERT_CAIXA.CODIGO = 
AC_MESAS_ABERTAS.COD_CAIXA)
  LEFT JOIN AC_MESAS_ITENS ON (AC_MESAS_ABERTAS.CODIGO = 
AC_MESAS_ITENS.COD_MESAS_ABERTAS)
  LEFT JOIN AC_RECEBIMENTO ON (AC_MESAS_ABERTAS.CODIGO = 
AC_RECEBIMENTO.COD_REGISTRO)
  LEFT JOIN ESTOQUE ON (AC_MESAS_ITENS.COD_PRODUTO = ESTOQUE.COD_ESTOQUE)
  LEFT JOIN FUNCIONARIOS ON (AC_MESAS_ITENS.COD_ATENDENTE = 
FUNCIONARIOS.COD_FUNC)
  WHERE FUNCIONARIOS.COD_FUNC LIKE :ICOD_FUNC
    AND ESTOQUE.COMISSIONADO = 'S'
    AND AC_RECEBIMENTO.TIPO =  'M'
    AND FUNCIONARIOS.CARGO = 'GARCOM'
    AND ABERT_CAIXA.DATA_ABRE BETWEEN :IDESDE AND :IATE
  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





----- Original Message ----- 
From: "Leonardo Vinicius Freitag" <freitagnx em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, January 16, 2008 6: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

E-mail classificado pelo Identificador de Spam Inteligente Terra.
Para alterar a categoria classificada, visite
http://mail.terra.com.br/cgi-bin/imail.cgi?+_u=kdcc&_l=1,1200517817.519509.32572.domoni.hst.terra.com.br,6794,Des15,Des15






Mais detalhes sobre a lista de discussão lista