[firebase-br] RES: Atualizar a tabela B com dados de A

Paulo Geloramo assisinformatica em gmail.com
Sex Set 7 12:00:06 -03 2018


Resultado dos testes:
1. EXECUTE BLOCK x SubSelect
2. Firebird 2.5.8
3. Banco de dados com 2.5GB
4. Tabela ESTOQUE não possui Trigger e View
5. EXECUTE BLOCK 19 minutos
6. SubSelect mais de 3 horas (desisti)
7. Tem indices para ID_EDICAO e ID_PONTO
8. Segue abaixo EXECUTE BLOCK e SubSelect usado:
======
EXECUTE BLOCK
AS
DECLARE ID_EDICAO INTEGER;
DECLARE ID_PONTO INTEGER;
DECLARE REMESSA INTEGER;
DECLARE DEVOLUCAO INTEGER;
DECLARE VENDA INTEGER;
BEGIN
  FOR SELECT ID_EDICAO, ID_PONTO, QUANTIDADE
      FROM NOTA_PONTO_ITEM
      INTO :ID_EDICAO, :ID_PONTO, :REMESSA DO
  BEGIN
    UPDATE ESTOQUE
    SET REMESSA = COALESCE(REMESSA + :REMESSA, 0)
    WHERE ID_EDICAO = :ID_EDICAO AND ID_PONTO = :ID_PONTO;
  END

  FOR SELECT ID_EDICAO, ID_PONTO, DEVOLUCAO, VENDA
      FROM CE_PONTO_ITEM
      INTO :ID_EDICAO, :ID_PONTO, :DEVOLUCAO, :VENDA DO
  BEGIN
    UPDATE ESTOQUE
    SET DEVOLUCAO = COALESCE(DEVOLUCAO + :DEVOLUCAO, 0), VENDA =
COALESCE(VENDA + :VENDA, 0)
    WHERE ID_EDICAO = :ID_EDICAO AND ID_PONTO = :ID_PONTO;
  END
END
======
UPDATE ESTOQUE Q
SET Q.REMESSA = COALESCE(Q.REMESSA + (
SELECT SUM(I.QUANTIDADE)
FROM NOTA_PONTO_ITEM I
WHERE I.ID_EDICAO = Q.ID_EDICAO AND I.ID_PONTO = Q.ID_PONTO), 0);

UPDATE ESTOQUE Q
SET Q.DEVOLUCAO = COALESCE(Q.DEVOLUCAO + (
SELECT SUM(I.DEVOLUCAO)
FROM CE_PONTO_ITEM I
WHERE I.ID_EDICAO = Q.ID_EDICAO AND I.ID_PONTO = Q.ID_PONTO), 0);

UPDATE ESTOQUE Q
SET Q.VENDA = COALESCE(Q.VENDA + (
SELECT SUM(I.VENDA)
FROM CE_PONTO_ITEM I
WHERE I.ID_EDICAO = Q.ID_EDICAO AND I.ID_PONTO = Q.ID_PONTO), 0);
======
9. Qualquer sugestão melhor e mais rápido será bem-vindo.

--
Paulo Geloramo
www.assisinformatica.com


Em sex, 7 de set de 2018 às 09:40, Felix - SOL Informática <
felix em solsistemas.com> escreveu:

> Atualizar a tabela B com dados de A
>
> Creio que o subselect seja a forma mais rápida, observando o seguinte:
> 1. há um índice para a.id ?
> 2. há triggers / views que impactem na velocidade de atualização da tabela
> B?
>
> www.solsistemas.com
> Francisco Felix
>
> -----Mensagem original-----
> De: lista [mailto:lista-bounces em firebase.com.br] Em nome de Paulo Geloramo
> Enviada em: sexta-feira, 7 de setembro de 2018 00:49
> Para: FireBase
> Assunto: Re: [firebase-br] Atualizar a tabela B com dados de A
>
> Quando a massa de dados é grande desta forma fica muito lento.
> Com Execute Block demorou 19 minutos.
> Caso tenha alguma sugestão que tenha um desempenho melhor.
> --
> Paulo Geloramo
> www.assisinformatica.com
>
>
> Em qui, 6 de set de 2018 às 19:49, Gabriel Bonzanini <
> gabriel.bonzanini em gmail.com> escreveu:
>
> > Acho que troquei a ordem das tabelas... Mas dá pra ter uma ideia.
> >
> > Em qui, 6 de set de 2018 19:43, Gabriel Bonzanini <
> > gabriel.bonzanini em gmail.com> escreveu:
> >
> > > Olá Paulo!
> > > Acredito que um subselect seja suficiente... Algo assim:
> > >
> > > UPDATE A SET A.QUANTIDADE = A.QUANTIDADE + (SELECT B.QUANTIDADE FROM
> > > B WHERE B.ID = A.ID)
> > >
> > > Abraço.
> > >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas:
> > http://www.firebase.com.br/pesquisa_lista.html
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br Para
> saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>



Mais detalhes sobre a lista de discussão lista