2008/12/11 Mozart Hasse <mozart.ha...@usa.net>:
> Preâmbulo da pergunta:
>
> Tenho o problema frequente de rodar scripts monstruosamente grandes (um
> milhão de comandos SQL separados por ponto-e-vírgula) com frequência. O
> problema é que pode ocorrer um erro láááááá no meio dele e aí eu
> preciso retomar daquele ponto e só então continuar com os comandos
> subsequentes. Meus requisitos:
>

Meu caro Mozart, você escreveu um e-mail longo, mas não colocou as
principais informações. Não disse como é o perfil da sua carga com
milhões de instruções SQL. Não tenho como adivinhar que tipo de
operação você está fazendo, se é uma operação do tipo "fechamento de
mês" onde vários dados são totalizados e transferidos de uma tabela
para outra, se é um cálculo mensal do tipo folha de pagamento ou se é
uma carga de dados vindo de outra fonte via txt por exemplo. Seja como
for, observe algumas coisas:

- COPY é melhor que multiplos INSERTs, que é melhor que INSERTS c/
PREPARED STATEMENTs, que são melhores que INSERTs individuais.
- INSERT é melhor que DELETE (escrevi um artigo sobre isso em:
http://www.midstorm.org/~telles/2007/11/29/nao-use-delete-use-insert/)
- Nenhum processo em lote deve ser executado via CLIENT/SERVER, rode
tudo via PL dentro do banco que você vai ter uma performance
absurdamente melhor;
- Se você puder agendar sua rotina em lote para um horário mais calmo,
pense em fazer uma configuração específica de desempenho para a carga,
por exemplo diminuindo o número de conexões e aumentando a memória
para uma conexão individual,
- Após a carga, sempre rode um vacuum analize nas tabelas afetadas
- Se tiver que fazer uma carga de dados em TXT com possíveis
problemas... considere trazer tudo para uma tabela burra (uma tabela
TEMPORÁRIA com um campo TEXT sem PK) para receber os dados
inicialmente dentro do banco. Depois de carregar todos os dados na
tabela burra, você poderá tratar os dados com SQL e mover os registros
problemáticos para outra área e aí sim transferir os registros da sua
tabela burra para os locais corretos.
- Remova constraints e índices quando for fazer grandes cargas e deixe
para reconstruí-los no final.
- Use cursores se estiver estourando a sua memória!
- Aprenda a utilizar COMMIT, ROLLBACK e SAVEPOINT corretamente e
estimar de quantos em quantos registros realizar um COMMIT.
- Aprenda a fazer o tratamento de erros em PL,

Como você pode ver, grandes caras exigem muito planejamento, estudo,
teste, etc. Não é trivial, mas os esforços costumam trazer resultados
surpreendentes. Se precisar de ajuda profissional, acredito que temos
algumas pessoas aqui na lista que poderão lhe prestar bons serviços
nesta área.

Espero ter ajudado.

[]s
Fábio Telles
-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: fabio.tel...@gmail.com
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a