[firebase-br] RES: RES: RES: Problemas Com "LEFT OUTER JOIN"

Eduardo Jedliczka edujed em gmail.com
Sex Jul 3 13:54:02 -03 2009


Não tenho como testar aqui, mas por favor informe qual o PLAN e o tempo
gasto para este Block (ele deve funcionar em qualquer lugar que aceite
um select:

execute block (cliente integer=:cliente)
returns (cod integer, data date, total numeric(15,2), status
varchar(30), nf integer, emissao date)
as
declare variable vStatus integer;
begin
  for select cod, data, total, status
    from pedido
    where codcliente = :codcliente
    Order by data desc, cod
    into :cod, :data, :total, :vStatus do
  begin
    if (vStatus = 0) then status = 'ABERTO';
    else  if (vStatus = 1) then status = 'ENTREGUE';
    else  if (vStatus = 2) then status = 'ENTREGUE E RECEBIDO';
    else  if (vStatus = 3) then status = 'RECEBIDO';
    else  if (vStatus = 4) then status = 'ENCERRADO';
    
    Select First 1 n.nf, n.emissao 
      from notas_pedido np
      inner join notas n on n.id=np.nota
      where np.pedido = :cod
    into :nf, :emissao;

    suspend;
  end
end;

Abraço

Eduardo Jedliczka

Em Sex, 2009-07-03 às 13:22 -0300, Mateus F. Ricci | ORION Technology
escreveu: 
> Bom, com essa que vc me mandou funcionou até que bem... porém não trouxe
> todas as informações que existem na tabela... vou tentar explicar melhor
> abaixo:
> 
> Seguinte:
> 1-tenho uma tabela da pedidos onde todos os pedidos do sistema são inseridos
> ok???
> 2-tenho uma tabela de notas onde todas as notas do sistema são inseridas
> ok??? 
> 3-as notas podem ser geradas a partir dos pedidos já feitos e tbm podem ser
> geradas manualmente, sem a necessidade de um pedido feito anteriormente...
> 4-tenho uma tabela de notas_pedidos, nessa tabela são gravados os pedidos
> que contem na nota, somente quando a nota é gerada a partir de um ou mais
> pedidos, caso contrário essa tabela não é alimentada com nenhuma
> informação...
> 5-ou seja, preciso mostrar a nota mesmo que não tenha um pedido relacionado
> a ela, porem preciso mostrar a nota de cada pedido quando o mesmo se
> relaciona com a nota...
> 
> Agora será que consegui explicar melhor, sou meio ruim pra escrever...
> 
> Qualquer outra dúvida me pergunte por favor, preciso resolver isso
> urgente... e se precisar da base de dados eu te mando...
> 
> Att.
> 
> Mateus Felipe Ricci
> ________________________________________________________
> ORION Technology - www.oriontechnology.com.br
> Sistemas de Gestão e Controle Empresarial - Assistência Técnica - Redes
> STelefone: (19) 3308-8838 / (19) 9274-9792
> /E-mail: mateus.ricci em oriontechnology.com.br
> EMSN: mateusricci_ti em hotmail.com.br 
> 
> 
> -----Mensagem original-----
> De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
> nome de Eduardo Jedliczka
> Enviada em: quinta-feira, 2 de julho de 2009 17:35
> Para: FireBase
> Assunto: Re: [firebase-br] RES: RES: Problemas Com "LEFT OUTER JOIN"
> 
> ainda não entendi exatamente o que você quer, mas então tenta este
> aqui...
> 
> select p.cod, p.data, p.total, case p.status
> when 0 then 'ABERTO'
> when 1 then 'ENTREGUE'
> when 2 then 'ENTREGUE E RECEBIDO'
> when 3 then 'RECEBIDO'
> when 4 then 'ENCERRADO'
> end as status,
> n.nf,
> n. emissao
> from notas_pedido np
> inner join pedito p on p.cod=np.pedido
> inner join notas n on n.id=np.nota
> where p.codcliente=2
> order by p.data desc, p.cod
> 
> abraço
> 
> Em Qui, 2009-07-02 às 17:20 -0300, Mateus F. Ricci | ORION Technology
> escreveu:
> > Tentei com a sua e sem chance cara, demora muito mais que a minha... olha
>> > 
> > Plan
> > PLAN (NP INDEX (PK_NOTAS_PEDIDOS))
> > PLAN SORT (JOIN (P INDEX (FK_PEDIDO_1), N NATURAL))
> > 
> > Adapted Plan
> > PLAN (NP INDEX (PK_NOTAS_PEDIDOS)) PLAN SORT (JOIN (P INDEX (FK_PEDIDO_1),
> N
> > NATURAL))
> > 
> > ------ Performance info ------
> > Prepare time = 0ms
> > Execute time = 38m 14s 125ms
> > Avg fetch time = 120.743,42 ms
> > Current memory = 14.592.520
> > Max memory = 15.495.156
> > Memory buffers = 2.048
> > Reads from disk to cache = 2.947
> > Writes from cache to disk = 4
> > Fetches from cache = 1.634.223.862
> > 
> > abraço
> > 
> > Mateus Felipe Ricci
> > ________________________________________________________
> > ORION Technology - www.oriontechnology.com.br
> > Sistemas de Gestão e Controle Empresarial - Assistência Técnica - Redes
> > STelefone: (19) 3308-8838 / (19) 9274-9792
> > /E-mail: mateus.ricci em oriontechnology.com.br
> > EMSN: mateusricci_ti em hotmail.com.br 
> > 
> > 
> > 
> > -----Mensagem original-----
> > De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
> Em
> > nome de Eduardo Jedliczka
> > Enviada em: quinta-feira, 2 de julho de 2009 16:18
> > Para: FireBase
> > Assunto: Re: [firebase-br] RES: Problemas Com "LEFT OUTER JOIN"
> > 
> > o problema é que a tablea Nota Pedido está AS NATURAL, pois você não
> > deve ter um índice APENAS para o campo pedido.
> > 
> > abaixo eu estou alterando o seu select (ele irá trazer resultados
> > diferente do atual caso haja mais várias notas para vários pedidos, mas
> > deve ser muito mais rápido...)
> > 
> > select p.cod, p.data, p.total, case p.status
> > when 0 then 'ABERTO'
> > when 1 then 'ENTREGUE'
> > when 2 then 'ENTREGUE E RECEBIDO'
> > when 3 then 'RECEBIDO'
> > when 4 then 'ENCERRADO'
> > end as status,
> > n.nf,
> > n. emissao
> > from pedito p
> > left outer join notas n on exists (select first 1 np.nota from
> notas_pedido
> > np where p.cod=np.pedido and n.id=np.nota)
> > where p.codcliente=2
> > order by p.data desc, p.cod
> > 
> > Abraço
> > 
> > Em Qui, 2009-07-02 às 15:52 -0300, Mateus F. Ricci | ORION Technology
> > escreveu:
> > 
> > > PLAN gerado é o seguinte:
> > > Plan
> > > PLAN JOIN (SORT (JOIN (P INDEX (FK_PEDIDO_1), NP NATURAL)), N INDEX
> > > (PK_NOTAS))
> > > 
> > > Adapted Plan
> > > PLAN JOIN (SORT (JOIN (P INDEX (FK_PEDIDO_1), NP NATURAL)), N INDEX
> > > (PK_NOTAS))
> > > 
> > > Os índices são:
> > > Na tabela Pedido no campo COD (PK) e tem 3 (FK)
> > > Na Tabela Notas_Pedidos no campo NOTA e no campo PEDIDO tem (PK)
> > > Na tabela Notas no campo ID (PK)
> > > 
> > > A versão do firebird é:
> > > 2.1.1.17910
> > > 
> > > Abraço
> > > 
> > > Mateus Felipe Ricci
> > > ________________________________________________________
> > > ORION Technology - www.oriontechnology.com.br
> > > Sistemas de Gestão e Controle Empresarial - Assistência Técnica - Redes
> > > STelefone: (19) 3308-8838 / (19) 9274-9792
> > > /E-mail: mateus.ricci em oriontechnology.com.br
> > > EMSN: mateusricci_ti em hotmail.com.br 
> > > 
> > > 
> > > -----Mensagem original-----
> > > De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
> > Em
> > > nome de Eduardo Jedliczka
> > > Enviada em: quinta-feira, 2 de julho de 2009 14:59
> > > Para: FireBase
> > > Assunto: Re: [firebase-br] Problemas Com "LEFT OUTER JOIN"
> > > 
> > > qual é o PLAN gerado pelo firebird ?
> > > 
> > > outra coisa, quais índices existem nestas tabelas (pks, fk, etc...)
> > > 
> > > qual é a versão do firebird usada ?
> > > 
> > > abraço
> > > 
> > > Em Qui, 2009-07-02 às 14:00 -0300, Mateus F. Ricci | ORION Technology
> > > escreveu:
> > > 
> > > > Olá, está ocorrendo um problemão aqui comigo... por favor, me
> ajudem...
> > > > 
> > > >  
> > > > 
> > > > Coloco a seguinte instrução: (nas tabelas existem muitos registros:
> > pedido
> > > =
> > > > 49.627, Notas = 7.111, Notas_Pedidos = 27.088) e a instrução retorna
> > > 45.314
> > > > registros
> > > > 
> > > > select
> > > > 
> > > >    p.cod,
> > > > 
> > > >    p.data,
> > > > 
> > > >    p.total,
> > > > 
> > > > case p.status
> > > > 
> > > > when 0 then 'ABERTO'
> > > > 
> > > > when 1 then 'ENTREGUE'
> > > > 
> > > > when 2 then 'ENTREGUE E RECEBIDO'
> > > > 
> > > > when 3 then 'RECEBIDO'
> > > > 
> > > > when 4 then 'ENCERRADO'
> > > > 
> > > > end as status,
> > > > 
> > > >     n.nf,
> > > > 
> > > >     n.emissao
> > > > 
> > > > from
> > > > 
> > > >   pedido p left outer join notas_pedidos np on (p.cod = np.pedido)
> left
> > > > outer join notas n on (n.id = np.nota)
> > > > 
> > > > where
> > > > 
> > > >   p.codcliente = 2
> > > > 
> > > > order by
> > > > 
> > > >   p.data desc,
> > > > 
> > > >   p.cod
> > > > 
> > > >  
> > > > 
> > > > ------ Performance info ------
> > > > 
> > > > Prepare time = 47ms
> > > > 
> > > > Execute time = 18m 41s 562ms
> > > > 
> > > > Avg fetch time = 59.029,58 ms
> > > > 
> > > > Current memory = 15.351.072
> > > > 
> > > > Max memory = 15.352.932
> > > > 
> > > > Memory buffers = 2.048
> > > > 
> > > > Reads from disk to cache = 2.587
> > > > 
> > > > Writes from cache to disk = 0
> > > > 
> > > > Fetches from cache = -1.840.952.896
> > > > 
> > > >  
> > > > 
> > > > Porém, a mesma instrução com os mesmos dados no ORACLE retorna os
> dados
> > em
> > > > menos de 3 segundos
> > > > 
> > > >  
> > > > 
> > > > Como resolver isso no firebird...
> > > > 
> > > >  
> > > > 
> > > > Se precisarem, eu mando a minha base de dados pra vocês, mas preciso
> > > urgente
> > > > resolver isso no firebird...
> > > > 
> > > >  
> > > > 
> > > > Muito obrigado
> > > > 
> > > >  
> > > > 
> > > > Mateus Felipe Ricci
> 





Mais detalhes sobre a lista de discussão lista