Primeiro, HD Sata de 5400 não dá né! Coloque SAS de 15k pelo menos!
Segundo, troque os SELECT IN por EXISTS ou encadeie novamente o SELECT para usar LEFT JOIN, outra coisa que você pode fazer é primeiro trazer os dados e depois aplicar as conversões.
Abraço, Fabiano Machado Dias Em 4/3/2011 07:55, Irineu Raymundo escreveu:
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. --Prezado Fábio, Obrigado pela ajuda, vou seguir o teu conselho e sugerir uma consultoria para avaliar o problema. De qualquer forma consegui levantar alguma informações,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? Os shared_buffers do postgres não tem valor de memória significativo alocada, o postgres tá dependendo totalmente do sistema operacional para o gerenciamento de memória. 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. O Postgres usou 3,7 GB de RAM. 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 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; Os explain analyze referente a ambos comandos: Comando 1: Sort (cost=3197917.93..3198379.07 rows=184457 width=7) (actual time=4255.189..4255.189 rows=0 loops=1) Sort Key: op.numero Sort Method: quicksort Memory: 25kB -> Seq Scan on ind_03_03_02_01_02 op (cost=0.00..3181784.47 rows=184457 width=7) (actual time=4255.150..4255.150 rows=0 loops=1) Filter: ((subplan) AND (subplan)) SubPlan -> Index Scan using ind_03_03_02_01_02_a1_idx_01 on ind_03_03_02_01_02_a1 op2 (cost=0.00..4.28 rows=1 width=4) (never executed) Index Cond: (((usuario)::text = 'adriel'::text) AND ((remessa)::text = ($0)::text) AND (sequencia_comp = 54) AND (op_aux2 = 392)) -> Index Scan using ind_03_03_02_01_02_a1_idx_01 on ind_03_03_02_01_02_a1 op2 (cost=0.00..4.28 rows=1 width=11) (actual time=0.004..0.004 rows=0 loops=737828) Index Cond: (((usuario)::text = 'adriel'::text) AND ((remessa)::text = ($0)::text) AND (sequencia_comp = 54) AND (op_aux2 = 392)) Total runtime: 4255.255 ms (11 rows) Comando 2: Unique (cost=165144.44..165144.45 rows=1 width=27) (actual time=5142.882..5142.882 rows=0 loops=1) -> Sort (cost=165144.44..165144.45 rows=1 width=27) (actual time=5142.880..5142.880 rows=0 loops=1) Sort Key: ((array_to_string((subplan), ' '::text))::character varying) Sort Method: quicksort Memory: 25kB -> Index Scan using ind_03_03_02_01_01_idx6 on ind_03_03_02_01_01 op (cost=0.00..165144.43 rows=1 width=27) (actual time=5142.810..5142.810 rows=0 loops=1) Index Cond: (((cod_componente)::text = ''::text) AND ((cod_material)::text = ''::text) AND (cod_cor = 0)) Filter: (((tamanho)::text<> ''::text) AND (subplan)) SubPlan -> Index Scan using ind_03_03_02_01_02_a1_idx_01 on ind_03_03_02_01_02_a1 op3 (cost=0.00..4.28 rows=1 width=11) (never executed) Index Cond: (((usuario)::text = ''::text) AND ((remessa)::text = ($2)::text) AND (sequencia_comp = 0) AND (op_aux2 = 0)) -> GroupAggregate (cost=7.25..7.29 rows=1 width=33) (never executed) -> Sort (cost=7.25..7.25 rows=1 width=33) (never executed) Sort Key: op2.remessa, op2.cod_componente, op2.cod_material, op2.cod_cor, op2.tamanho -> Index Scan using ind_03_03_02_01_01_idx6 on ind_03_03_02_01_01 op2 (cost=0.00..7.24 rows=1 width=33) (never executed) Index Cond: (((remessa)::text = ($2)::text) AND ((cod_componente)::text = ($3)::text) AND ((cod_material)::text = ($4)::text) AND (cod_cor = $5)) Filter: (((tamanho)::text<> ''::text) AND (subplan)) SubPlan -> Index Scan using ind_03_03_02_01_02_a1_idx_01 on ind_03_03_02_01_02_a1 op3 (cost=0.00..4.28 rows=1 width=4) (never executed) Index Cond: (((usuario)::text = ''::text) AND ((remessa)::text = ($0)::text) AND (sequencia_comp = 0) AND (op_aux2 = 0)) Total runtime: 5143.021 ms (20 rows) ------------------------------------------------------------------------------------------------------------ Esta mensagem foi verificada pelo sistema de Seguran�a da SJB Solados Ltda. _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
