Márcio, realmente, o upper e o coalesce impedem o uso do índice no campo. 
Sugiro você criar um índice com o campo já maiúsculo e remover o coalesce, já 
que me parece não ter muito uso substituir os nulos por '%' (provavelmente essa 
cláusula não tem efeito algum na sua consulta, a menos que ela seja gerada 
dinamicamente). Faça o mesmo para os demais campos e rode um analyze novamente, 
só para garantir. :)

 

CREATE INDEX ON emitente ((upper(nm_emitentecompleto)));

 

Para resolver a cláusula em parc.vlr_valor, sugiro você isolar os valores nulos 
em uma condição própria, algo como:

 

(parc.vl_valor between 0 and 999999999 or parc.vl_valor is null)

 

 

No parc.vl_valor eu setei para not null e, tirando o coalesce ficou muito bom.

Agora criei o índice na tabela uni_emitente (cfe o comando que vc passou 
acima), rodei analyze no banco todo, deixei a linha assim: 
emitente.nm_emitentecompleto like '%CONSUMIDOR%' and

e não resolveu. Se comento esta linha fica bala.

Pra ter uma idéia tá rodando a 20 minutos e não vai. Não consigo nem tirar o 
analyze pra enviar.

 

 

Agora, apenas para entendimento:

1) Onde diz no explain analyze que o problema era com estas duas linhas? (como 
disse, sou bem leigo nisso e to tentando aprender - Talvez nem tem como saber 
por ele...);

 

2) Sabem o pq dele rodar bem na 9.0 e lento na 9.4 e 9.5? 

Passei por alto no relnotes, mas não encontrei nada... (talvez tenha visto, mas 
como não manjo muito, posso não ter entendido)

 

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

Responder a