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

Carlos H. Cantu listas em warmboot.com.br
Sex Set 7 13:45:54 -03 2018


Sem os PLANs de execução é dificil dizer alguma coisa.

Geralmente quando falamos em atualização em massa, o que pode ajudar
é:

1) Desligar o forced writes
2) Desligar índices "desnecessários" e reativá-los depois de
finalizado o processo
3) Desativar possíveis triggers (que não comprometam o resultado)
4) Desligar triggers de "log de auditoria" quando existirem

[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

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

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

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

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

PG> --
PG> Paulo Geloramo
PG> www.assisinformatica.com


PG> Em sex, 7 de set de 2018 às 09:40, Felix - SOL Informática <
PG> 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.





Mais detalhes sobre a lista de discussão lista