[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