Pessoal,

estou postando o resultado para a lista. A única mudança que fiz na view foi 
trocar o left por join em 2 pontos abaixo, que são campo do tipo not null em 
nfe, como demonstrado abaixo:

  FROM nfe

       LEFT JOIN compras c ON c.id = nfe.id_compra
       LEFT JOIN vendas v ON v.id = nfe.id_venda
       --> JOIN terceiros t1 ON nfe.id_terceiro = t1.id
       --> JOIN naturezas_operacoes nop1 ON nfe.id_nat_operacao = nop1.id
       JOIN nfe_filas f ON f.id = nfe.id_fila
       LEFT JOIN terceiros t2 ON t2.id = nfe.id_func_emissao
       LEFT JOIN terceiros t3 ON t3.id = nfe.id_func_cancelamento
       LEFT JOIN romaneios r1 ON r1.id = v.id_romaneio
       LEFT JOIN romaneios r2 ON r2.id = c.id_romaneio_devolucao
       LEFT JOIN nfe_contingencia ctg ON ctg.id = nfe.id_contingencia;

e o explain mudou para:

"QUERY PLAN"
"Sort  (cost=29222.73..29223.54 rows=324 width=641)"
"  Sort Key: nfe.numero_nf, nfe.id"
"  ->  Hash Left Join  (cost=211.70..29205.98 rows=324 width=522)"
"        Hash Cond: (nfe.id_contingencia = ctg.id)"
"        ->  Nested Loop Left Join  (cost=210.65..29117.04 rows=324 width=520)"
"              ->  Nested Loop Left Join  (cost=210.65..27649.64 rows=324 
width=508)"
"                    ->  Nested Loop Left Join  (cost=210.65..26182.25 rows=324 
width=496)"
"                          ->  Nested Loop Left Join  (cost=210.65..25872.07 
rows=324 width=474)"
"                                ->  Nested Loop  (cost=210.65..25561.89 
rows=324 width=452)"
"                                      ->  Seq Scan on nfe_filas f  
(cost=0.00..1.04 rows=1 width=11)"
"                                            Filter: (id = 1)"
"                                      ->  Nested Loop  (cost=210.65..25557.61 
rows=324 width=443)"
"                                            ->  Nested Loop Left Join  
(cost=210.65..25247.43 rows=324 width=398)"
"                                                  ->  Nested Loop Left Join  
(cost=210.65..23110.78 rows=324 width=379)"
"                                                        ->  Hash Join  
(cost=210.65..21953.33 rows=324 width=361)"
"                                                              Hash Cond: 
(nfe.id_nat_operacao = nop1.id)"
"                                                              ->  Bitmap Heap 
Scan on nfe  (cost=209.16..21937.54 rows=2948 width=337)"
"                                                                    Recheck 
Cond: (((id_empresa = 1) AND (dh_envio_email IS NULL)) OR ((id_empresa = 1) AND 
(dh_cancelamento IS NOT NULL)))"
"                                                                    Filter: 
((((dh_cancelamento IS NULL) AND (dh_envio_email IS NULL) AND (NOT 
nao_enviar_email)) OR ((dh_cancelamento IS NOT NULL) AND (dh_envio_email_canc 
IS NULL) AND (NOT nao_enviar_email_canc))) AND ((COALESCE(email, ''::character 
varying))::text <> ''::text) AND (id_fila = 1) AND (status_retorno = 
'1'::bpchar))"
"                                                                    ->  
BitmapOr  (cost=209.16..209.16 rows=7469 width=0)"
"                                                                          ->  
Bitmap Index Scan on nfe_idx12  (cost=0.00..203.11 rows=7460 width=0)"
"                                                                               
 Index Cond: ((id_empresa = 1) AND (dh_envio_email IS NULL))"
"                                                                          ->  
Bitmap Index Scan on nfe_idx7  (cost=0.00..4.58 rows=9 width=0)"
"                                                                               
 Index Cond: ((id_empresa = 1) AND (dh_cancelamento IS NOT NULL))"
"                                                              ->  Hash  
(cost=1.22..1.22 rows=22 width=32)"
"                                                                    ->  Seq 
Scan on naturezas_operacoes nop1  (cost=0.00..1.22 rows=22 width=32)"
"                                                        ->  Index Scan using 
compras_pkey on compras c  (cost=0.00..3.56 rows=1 width=26)"
"                                                              Index Cond: (id 
= nfe.id_compra)"
"                                                  ->  Index Scan using 
vendas_pkey on vendas v  (cost=0.00..6.58 rows=1 width=27)"
"                                                        Index Cond: (id = 
nfe.id_venda)"
"                                            ->  Index Scan using 
terceiros_pkey on terceiros t1  (cost=0.00..0.94 rows=1 width=49)"
"                                                  Index Cond: (id = 
nfe.id_terceiro)"
"                                ->  Index Scan using terceiros_pkey on 
terceiros t2  (cost=0.00..0.94 rows=1 width=30)"
"                                      Index Cond: (id = nfe.id_func_emissao)"
"                          ->  Index Scan using terceiros_pkey on terceiros t3  
(cost=0.00..0.94 rows=1 width=30)"
"                                Index Cond: (id = nfe.id_func_cancelamento)"
"                    ->  Index Scan using romaneios_pkey on romaneios r1  
(cost=0.00..4.52 rows=1 width=20)"
"                          Index Cond: (id = v.id_romaneio)"
"              ->  Index Scan using romaneios_pkey on romaneios r2  
(cost=0.00..4.52 rows=1 width=20)"
"                    Index Cond: (id = c.id_romaneio_devolucao)"
"        ->  Hash  (cost=1.02..1.02 rows=2 width=6)"
"              ->  Seq Scan on nfe_contingencia ctg  (cost=0.00..1.02 rows=2 
width=6)"

com a execução caindo para 765 ms quando em cache. Me surpreende o fato de os 
join alterados não serem na tabela compras, e agora o plano usar o índice 
desejado em compras. Não caberia aqui alguma melhoria no algorítimo do 
otimizador?

De qualquer forma, obrigado a todos pela ajuda. Foi esclarecedor pra mim e pra 
lista.

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

Responder a