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