Em 3 de março de 2011 13:17, Irineu Raymundo <iri...@senda.inf.br> escreveu:

>  Prezado Fábio,
>
> Obrigado pela ajuda.
>
> Segundo o que consegui levantar o problema se resume a 2 comandos SQL.
>
> abaixo segue os comandos.Poderia a falta de um índice mais apropriado
> causar essa demora toda na execução dele?
>
> Segue abaixo algumas informações que coletei com o TI do cliente.
>
> Os shared_buffers do postgres não tem valor de memória alocada, o postgres
> tá dependendo totalmente do sistema operacional para o gerenciamento de
> memória.
>

Você poderia mandar o postgresql.conf?


>  Servidor: OS Linux RedHat Interprise 5,  2  HD's SATA 5200rpm fazendo
> raide 1, 4GB RAM.
>
> PostgreSQL 8.3 ,base com 19GB aproximadamente.
>
>
>
> O processo problemático iniciou aproximadamente as 13:17 de ontem e
> terminou as 15:04.
>
> Tasks: 238 total,   1 running, 237 sleeping,   0 stopped,   0 zombie
> Cpu0  :  4.0%us,  1.0%sy,  0.0%ni, 93.0%id,  2.0%wa,  0.0%hi,  0.0%si,
> 0.0%st
> Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,
> 0.0%st
> Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,
> 0.0%st
> Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,
> 0.0%st
> Mem:   4047872k total,  4016308k used,    31564k free,    44136k buffers
> Swap:  4192956k total,      164k used,  4192792k free,  *3161408k cached*
>
> Foi alterado a  configuracao do PostgreSQL para reportar nos logs todo
> comando SQL cujo tempo de execucao ultrapesse 500ms.
>
>
>
> Gerou 1.534 comandos SQL no log, indicando que esse processo executou
> aproximadamente 1.500 comandos SQL com tempo superior a 500ms. O log aponta
> que estes comandos se resumem a apenas 2 comandos SQL, um sendo executado
> 513 vezes e o outro 1019.
>
>
>

Essa quantidade de comandos é referente apenas à execução do seu processo em
lote ou é um extrato da base de produção? Esses números se referem à quanto
tempo de execução na base?

O problema é de lentidão generalizada na base ou é apenas do seu processo em
lote?


>  Essa tabela tem (ind_03_03_02_01_01) tem 840MB.
>
>
>
> Os dois comandos SQL sao:
>
>  1019 vezes:
> SELECT DISTINCT
>                CAST(array_to_string(ARRAY(SELECT op2.tamanho || '/' ||
> CAST(SUM(op2.quantidade) AS VARCHAR)
>                                             FROM senda.ind_03_03_02_01_01
> op2
>                                            WHERE op2.tamanho <> '' AND
>                                                  op2.remessa = op.remessa
> AND
>                                                  op2.cod_componente =
> op.cod_componente AND
>                                                  op2.cod_material =
> op.cod_material AND
>                                                  op2.cod_cor = op.cod_cor
> AND
>                                                 op2.cod_op IN
>                                                (SELECT op3.cod_op
>                                                   FROM
> senda.ind_03_03_02_01_02_a1 op3
>                                                  WHERE op3.remessa =
> op2.remessa AND
>                                                         op3.op_aux2 =0 AND
>                                                        op3.usuario = '' AND
>                                                        op3.sequencia_comp =
> 0)
>                                         GROUP BY op2.remessa,
> op2.cod_componente, op2.cod_material, op2.cod_cor, op2.tamanho
>                                         ORDER BY op2.remessa,
> op2.cod_componente, op2.cod_material, op2.cod_cor, op2.tamanho
>                                          ), '   ') AS VARCHAR) AS grade
>           FROM senda.ind_03_03_02_01_01 op
>          WHERE op.tamanho <> '' AND
>                op.remessa IN (SELECT op3.remessa
>                                 FROM senda.ind_03_03_02_01_02_a1 op3
>                                WHERE op3.remessa = op.remessa AND
>                                      op3.op_aux2 = 0 AND
>                                      op3.sequencia_comp = 0 AND
>                                      op3.usuario =  '')  AND
>                op.cod_componente = '' AND
>                op.cod_material = '' AND
>                op.cod_cor = 0;
>
> 513 vezes:
> SELECT
> op.numero,
>  op.quantidade
>
>  FROM senda.ind_03_03_02_01_02
> op
>
>  WHERE op.remessa IN(SELECT
> op2.remessa
>
>   FROM senda.ind_03_03_02_01_02_a1
> op2
>   WHERE op2.remessa =
> op.remessa
>         AND op2.sequencia_comp =
> 54
>         AND op2.op_aux2 =
> 392
>         AND op2.usuario =
> 'adriel')
>         AND op.cod_op
> IN
>
>   (SELECT
> op2.cod_op
>
>    FROM senda.ind_03_03_02_01_02_a1
> op2
>    WHERE op2.remessa = op.remessa
> AND
>          op2.sequencia_comp = 54
> AND
>          op2.op_aux2 =392
> AND
>          op2.usuario =
> 'adriel')
> order by numero;
>
>
Olha, eu não gosto muito da formação deste SQL. Não posso afirmar como é a
melhor forma. Eu particularmente não gosto de colocar SELECTs aninhados
antes do FROM, e evito ao máximo colocar no WHERE. Mas como o seu select tem
ARRAYs no meio, não me atreveria a dizer o que está certo ou errado sem
entender melhor. Precisamos conhecer a estrutura das tabelas também.


Enfim, temos que olhar o processo como um todo para poder avaliar onde está
o seu gargalo. Afinal, executar centenas de vezes o mesmo comando é um
problema. Se fizer parte de requisições isoladas de usuários, tudo bem, mas
se um processo em lote faz isso, é claro que o processo está com o fluxo mal
desenhado.

>
>
>
> *De:* Fábio Telles Rodriguez [mailto:fabio.tel...@gmail.com]
> *Enviada em:* quinta-feira, 3 de março de 2011 12:00
> *Para:* Comunidade PostgreSQL Brasileira
> *Cc:* Irineu Raymundo; Marcelo Silva (IG)
> *Assunto:* Re: [pgbr-geral] RES: Uso de memória pelo postgres
>
>
>
>
>
> Em 25 de fevereiro de 2011 12:46, Irineu Raymundo <iri...@senda.inf.br>
> escreveu:
>
> Marcelo,
>
> tua sugestão de criar as tabelas com nome único é bem interessante.
>
> hj não tenho problema com as tabelas temporárias por que antes de dar um
> COMMIT elas são dropadas,
> tm essa rotina é exclusiva, apenas um usuário pode executar.
>
> tive problema com tabela em uso exclusivo, motivo pelo qual uso as
> temporárias, insiro nelas os dados e ai posso manipular a vontade, sem
> bloquear ninguém.
>
> o processo não faz UPDATE em nenhum registro, antes de dar o INSERT do
> resultado da função faço um DELETE dos registros antigos.
>
>
>
>
>
> Como o Euler disse, fica muito difícil imaginar o que a sua rotina está
> fazendo. Se for um processo crítico para você, recomendo contratar uma
> consultoria para avaliar o problema. Podemos dar algumas dicas aqui, mas os
> seus problemas podem começar na configuração do PostgreSQL, passando por
> problemas de modelagem e possivelmente de reescrita do procedimento com o um
> todo.
>
>
>
> Sem enxergar o processo como um todo, fica muito difícil lhe ajudar. Já fiz
> este tipo de trabalho para várias vezes e sei como é difícil ajudar sem ter
> uma visão global do problema. Tenho certeza de que você vai encontrar ótimos
> profissionais por aqui.
>
>
>
> Agora, se você puder mostra todo o processo aqui, então poderemos lhe dar
> algumas idéias, claro.
>
>
>
> --
>
> Atenciosamente,
>
> Fábio Telles Rodriguez
>
> blog: http://www.midstorm.org/~telles/
> e-mail / gtalk / MSN: fabio.tel...@gmail.com
>
> Skype: fabio_telles
>
>
>
> ------------------------------------------------------------------------------------------------------------------
>
> Esta mensagem foi verificada pelo sistema de Seguran硠da SJB Solados.
>
> ------------------------------------------------------------------------------------------------------------------
>
> Esta mensagem foi verificada pelo sistema de Segurança da SJB Solados.
>



-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http://www.midstorm.org/~telles/
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a