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