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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a