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