Re: [pgbr-geral] Vacuum e Vacuum Full

2017-09-22 Por tôpico Euler Taveira
Em 22 de setembro de 2017 16:36, Fernando Franquini 'capin' <
fernando.franqu...@gmail.com> escreveu:

>
> tenho um ambiente com Postgres 9.3.19.
> Linux Centos 6 Kernel 2.6.32-504.12.2.el6.x86_64 (sei que é velho! eheh)
>
> Se ambos estiverem com correções aplicadas, não vejo problema (pelo menos
até serem descontinuados). Daqui a 1 ano a versão 9.3 será descontinuada; é
tempo suficiente para você planejar a migração para uma versão recente.


> O problema que não tenho entendido é que mesmo após executar os comandos
> de Vacuum ou Vacuum full nessas tabelas, os valores ainda permanecem
> inalterados.
>
> O que você precisa entender é que as colunas n_tup_* são incrementais (a
não ser que você faça um reset nas estatísticas) e a coluna n_dead_tup é
alterada com a execução do VACUUM (valor vai para zero). Apesar de n_tup_*
ser incremental, há uma outra variável (n_mod_since_analyze -- valor só foi
exposto a partir da 9.4) que vai guardando o quanto foi alterado para usar
como base para disparar o autoanalyze (valor vai a zero depois da
execução). O autovacuum é disparado comparando com n_dead_tup.

Se você estiver preocupado com espaço deixado pelo inchaço e quer controlar
isso melhor, eu sugiro que você agende VACUUM manual ao longo do dia (em um
horário conveniente) ou diminua os parâmetros do autovacuum (somente se o
quantitativo de tabelas que crescem for pequeno. A ideia é não prejudicar o
andamento da operação ao longo do dia).


-- 
   Euler Taveira   Timbira -
http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento

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

Re: [pgbr-geral] Integração PostgreSQL RDS com LDAP (AD)

2017-09-22 Por tôpico Euler Taveira
Em 22 de setembro de 2017 17:48, Vinícius Aquino do Vale
 escreveu:
> Estou precisando integrar o meu PostgreSQL (>= 9.3) / MySQL (>= 5.6) que
> está no RDS com o LDAP (Windows Active Directory - AD), alguém já fez isso?
> Sabe se tem alguma documentação da AWS para isso. Pelo AWS estou limitado em
> mexer em algumas alterações.
>
No RDS você não pode alterar o pg_hba.conf [1], portanto, não irá
conseguir usar um método de autenticação externo.

[1] 
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.Access


-- 
   Euler Taveira   Timbira -
http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] tutorial e dicas de explain analyze

2017-09-22 Por tôpico Euler Taveira
2017-09-22 10:39 GMT-03:00 Luiz Henrique :
> "  ->  Sort  (cost=358689.48..359569.53 rows=352018 width=287) (actual
> time=101865.979..103271.970 rows=2631834 loops=1)"
>
O plano está gastando ~86% do tempo da consulta nessa ordenação. Você
realmente precisa de um DISTINCT ali? O que você pode fazer é tentar
aumentar o work_mem para essa consulta (um valor superior a ~ 715MB)
na tentativa de fazer uma ordenação mais rápida. Com essa quantidade
de registros retornados não vejo como acelerar muito essa consulta.


-- 
   Euler Taveira   Timbira -
http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] Integração PostgreSQL RDS com LDAP (AD)

2017-09-22 Por tôpico Vinícius Aquino do Vale
Olá pessoal,

Estou precisando integrar o meu PostgreSQL (>= 9.3) / MySQL (>= 5.6) que
está no RDS com o LDAP (Windows Active Directory - AD), alguém já fez isso?
Sabe se tem alguma documentação da AWS para isso. Pelo AWS estou limitado
em mexer em algumas alterações.

Fiz umas pesquisas aqui e não encontrei nada que sirva para o meu caso.



Att,
Vinicius Vale
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Vacuum e Vacuum Full

2017-09-22 Por tôpico Daniel Luiz da Silva



De: "Fernando Franquini 'capin'"  
Para: "Lista: Comunidade PostgreSQL Brasileira" 
 
Enviadas: Sexta-feira, 22 de setembro de 2017 16:36:46 
Assunto: [pgbr-geral] Vacuum e Vacuum Full 

Boa tarde, 
tenho um ambiente com Postgres 9.3.19. 
Linux Centos 6 Kernel 2.6.32-504.12.2.el6.x86_64 (sei que é velho! eheh) 

Tenho várias tabelas que são removidos e inseridos vários dados durante o dia 
todo, tempo todo. 

Preciso as vezes executar vacuum e vacuum full na mão, vou colocar um print 
para terem ideia dos volumes de dados: 


Os meus parâmetros do Autovacuum estão no padrão: 

O Autovacuum quase não tem executado, logo, os parâmetros não estão atendendo, 
em conversa com o Fabrizio alterei alguns parâmetros direto nas tabelas. 

O problema que não tenho entendido é que mesmo após executar os comandos de 
Vacuum ou Vacuum full nessas tabelas, os valores ainda permanecem inalterados. 

Alguém saberia me dizer mais alguma coisa? 

Grato pela atenção. 
-- 
Capin 
Graduado: Bacharel em Ciências da Computação - UFSC 
Analista de Sistemas e de Banco de Dados / DBA 
48.9924.8212 Vivo - Florianópolis - SC - Brasil 
http://certificacaobd.com.br/ 
http://br.linkedin.com/in/capin 


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

-- 

Fernando, 

Acredito que o Fabrízio já falou sobre isso, mas se não falou é importante 
monitorar essas tabelas que tem mais alterações e configurar o autovacuum mais 
agressivo, ou seja, executar mais vezes durante o dia, mas claro, sempre 
lembrando que essa organização custa para manter tudo "em ordem". Se tua(s) 
tabela(s) está desorganizando com muita frequência tem intervir para que isso 
não aconteça, mas é necessário avaliar essa necessidade. 
Que tabela é essa? Esses percentuais, se for sobre percentuais calculados de 
linhas mortas dentro da tabela, de que forma está executando o calculo? 
Assunmindo esses valores como reais, pode-se considerar baixo 0.65%, MAS 
CUIDADO, depende do ambiente que estás trabalhando. 
Esse valor bom de percentual de linhas mortas, ou percentual de desorganização 
na tabela, só testando as consultas mais executadas e verificar se vale o 
investimento de manter toda ordem. 

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

[pgbr-geral] Vacuum e Vacuum Full

2017-09-22 Por tôpico Fernando Franquini 'capin'
Boa tarde,

tenho um ambiente com Postgres 9.3.19.
Linux Centos 6 Kernel 2.6.32-504.12.2.el6.x86_64 (sei que é velho! eheh)

Tenho várias tabelas que são removidos e inseridos vários dados durante o
dia todo, tempo todo.

Preciso as vezes executar vacuum e vacuum full na mão, vou colocar um print
para terem ideia dos volumes de dados:
[image: Imagem inline 1]

Os meus parâmetros do Autovacuum estão no padrão:

O Autovacuum quase não tem executado, logo, os parâmetros não estão
atendendo, em conversa com o Fabrizio alterei alguns parâmetros direto nas
tabelas.

O problema que não tenho entendido é que mesmo após executar os comandos de
Vacuum ou Vacuum full nessas tabelas, os valores ainda permanecem
inalterados.

Alguém saberia me dizer mais alguma coisa?

Grato pela atenção.
-- 
Capin
Graduado: Bacharel em Ciências da Computação - UFSC
Analista de Sistemas e de Banco de Dados / DBA
48.9924.8212 Vivo - Florianópolis - SC - Brasil

http://certificacaobd.com.br/
http://br.linkedin.com/in/capin
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] tutorial e dicas de explain analyze

2017-09-22 Por tôpico Luiz Henrique
Uellinton

A tabela ned_nota_empenho_despesa tem 174.000
A tabela orcamentario_mensal tem 63.000
Ambas com indice


2017-09-22 10:50 GMT-03:00 Uellinton Mendes :

> Bom Dia Luiz,
>
> Já tentou usar essa ferramenta online?
>
> https://explain.depesz.com/
>
> É muito legal.
>
> Duvida, quantos registros tem mesmo em ned_nota_empenho_despesa e
> orcamentario_mensal?
>
> Essas duas tabelas estão sem indices?
>
> *Uellinton Mendes*
> 11-9-9167-3524 [OI]
>
> Em 22/09/2017 10:39, Luiz Henrique escreveu:
>
> Prezados,
>
> Procuro por links com tutorias aborando o "explain analyze". Como
> interpretar cada linha apresentada por ele. Alguém recomenda algum site ?
>
> Tenho uma consulta aqui com 1,5 minuto de duração e gostaria de tentar
> otimiza-la
> Ao executar o explain analyze não entendi bem onde atuar para melhorar
>
> Segue abaixo o sql e o explain. Toda ajuda será bem-vinda
>
> ### explain analyze
>
> explain analyze select distinct npd.exercicio
>   , npd.unidadegestora
>   , npd.numero
>   , npd.numeronld
>   , nld.numero as nldorigem
>   , nld.numeroned
>   , ned.numero as nedorigem
>   , ned.numeronpf
>   , npf.numero as npforigem
>   , npf.grupo_fin as grupofin
>   , orm.cod_tp_orcamento as tipcre
>   , npd.classiforcamreduz
>   , npd.classiforcamcompl
>   , npd.credor
>   , npd.nomecredor
>   , npd.statusmovbancario
>   , npd.natureza
>   , nld.numeroned as numemp
>   , npd.codigoretencao
>   , npd.dataemissao
>   , npd.dt_etl
>   , npd.servicobancario
>   , npd.bancobeneficiario as banco
>   , npd.agenciabeneficiario as agencia
>   , npd.contabeneficiario as conta
>   , npd.efeito
>   , substring(ned.classiforcamcompl from 24 for 8) as natdespesa
>   , substring(ned.classiforcamcompl from 33 for 2) as fonterec
>   , npd.valor as valor
>   , npd.cpfcnpjcredor
>   , cast(npd.numeronld as integer) as "numliq"
>   , npd.numeronpf
>   , npd.numeronpdordinario
>   , exerciciorestosapagar
> from sefaz_ws.npd_nota_pagamento_despesa npd
> left join sefaz_ws.nld_nota_liquidacao_despesa nld
>  on (npd.exercicio = nld.exercicio
>  and npd.unidadegestora = nld.unidadegestora
>  and npd.numeronld = nld.numero)
> left join sefaz_ws.ned_nota_empenho_despesa ned
>  on (nld.exercicio = ned.exercicio
>  and nld.unidadegestora = ned.unidadegestora
>  and nld.numeroned = ned.numero)
> left join sefaz_ws.npf_nota_programacao_financeira npf
>  on (ned.exercicio = npf.exercicio
>  and ned.unidadegestora = npf.unidadegestora
>  and ned.numeronpf = npf.numero)
> left join sefaz_ws.orcamentario_mensal orm
>  on (npd.exercicio = orm.exercicio and npd.unidadegestora =
> orm.unidadegestora and orm.classif_orcam_reduz = CAST(ned.classiforcamreduz
> AS integer))
> order by npd.exercicio, npd.unidadegestora, npd.numero
>
>  resultado do explain analyze
>
> "Unique  (cost=358689.48..389491.06 rows=352018 width=287) (actual
> time=101865.980..107098.130 rows=352018 loops=1)"
> "  ->  Sort  (cost=358689.48..359569.53 rows=352018 width=287) (actual
> time=101865.979..103271.970 rows=2631834 loops=1)"
> "Sort Key: npd.exercicio, npd.unidadegestora, npd.numero,
> npd.numeronld, nld.numero, nld.numeroned, ned.numero, ned.numeronpf,
> npf.numero, npf.grupo_fin, orm.cod_tp_orcamento, npd.classiforcamreduz,
> npd.classiforcamcompl, npd.credor, npd.nomecredor, npd.statusmovbancario,
> npd.natureza, npd.codigoretencao, npd.dataemissao, npd.dt_etl,
> npd.servicobancario, npd.bancobeneficiario, npd.agenciabeneficiario,
> npd.contabeneficiario, npd.efeito, ("substring"((ned.classiforcamcompl)::text,
> 24, 8)), ("substring"((ned.classiforcamcompl)::text, 33, 2)), npd.valor,
> npd.cpfcnpjcredor, npd.numeronpf, npd.numeronpdordinario,
> nld.exerciciorestosapagar"
> "Sort Method: external merge  Disk: 731704kB"
> "->  Hash Left Join  (cost=104246.16..279334.81 rows=352018
> width=287) (actual time=1322.332..6808.805 rows=2631834 loops=1)"
> "  Hash Cond: ((npd.exercicio = orm.exercicio) AND
> (npd.unidadegestora = orm.unidadegestora) AND 
> ((ned.classiforcamreduz)::integer
> = orm.classif_orcam_reduz))"
> "  ->  Merge Left Join  (cost=100158.37..188918.69 rows=352018
> width=290) (actual time=1295.093..3653.514 rows=352018 loops=1)"
> "Merge Cond: ((npd.unidadegestora =
> nld.unidadegestora) AND (npd.exercicio = nld.exercicio) AND (npd.numeronld
> = nld.numero))"
> "->  Index Scan using npd_nota_pagamento_despesa_
> idx_gestora_exercicio_numeronld on npd_nota_pagamento_despesa npd
> (cost=0.00..82171.24 rows=352018 width=215) (actual time=0.009..1846.104
> rows=352018 loops=1)"
> "->  Sort  (cost=100158.37..100655.53 rows=198865
> width=83) (actual time=1295.075..1355.207 rows=364791 loops=1)"
> "  Sort Key: 

Re: [pgbr-geral] Slides - PGBR 2017

2017-09-22 Por tôpico Fabiano Machado Dias
Não sabia! Obrigado pelo retorno.

Abs.
Fabiano

Em 22 de setembro de 2017 11:15, Sebastian Webber 
escreveu:

>
>
> Em sex, 22 de set de 2017 às 11:12, Fabiano Machado Dias <
> fabi...@wolaksistemas.com.br> escreveu:
>
>> Queria muito ver a palestra do Emerson Engroff, PG em Memória,
>> infelizmente não consegui ir pela manhã no evento.
>>
>>
> Ele acabou não vindo e usamos a sala pra extender outra palestra.
>
> ___
> 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

Re: [pgbr-geral] Slides - PGBR 2017

2017-09-22 Por tôpico Sebastian Webber
Em sex, 22 de set de 2017 às 11:12, Fabiano Machado Dias <
fabi...@wolaksistemas.com.br> escreveu:

> Queria muito ver a palestra do Emerson Engroff, PG em Memória,
> infelizmente não consegui ir pela manhã no evento.
>
>
Ele acabou não vindo e usamos a sala pra extender outra palestra.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Slides - PGBR 2017

2017-09-22 Por tôpico Fabiano Machado Dias
Queria muito ver a palestra do Emerson Engroff, PG em Memória, infelizmente
não consegui ir pela manhã no evento.

Abs.
Fabiano

Em 22 de setembro de 2017 10:53, Sebastian Webber 
escreveu:

>
>
> Em sex, 22 de set de 2017 às 10:51, Fabiano Machado Dias <
> fabi...@wolaksistemas.com.br> escreveu:
>
>> Bom dia,
>>
>> Alguém sabe quando serão disponibilizados os slides das palestras do PGBR?
>>
>
> E ai Fabiano, tudo bem?
>
> Alguns deles já estão no site.
>
> Estou atualizando os mesmos conforme o pessoal vai me mandando.
>
> --
> Sebastian Webber
> http://swebber.me
>
> ___
> 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

Re: [pgbr-geral] Slides - PGBR 2017

2017-09-22 Por tôpico Sebastian Webber
Em sex, 22 de set de 2017 às 10:51, Fabiano Machado Dias <
fabi...@wolaksistemas.com.br> escreveu:

> Bom dia,
>
> Alguém sabe quando serão disponibilizados os slides das palestras do PGBR?
>

E ai Fabiano, tudo bem?

Alguns deles já estão no site.

Estou atualizando os mesmos conforme o pessoal vai me mandando.

--
Sebastian Webber
http://swebber.me
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

[pgbr-geral] Slides - PGBR 2017

2017-09-22 Por tôpico Fabiano Machado Dias
Bom dia,

Alguém sabe quando serão disponibilizados os slides das palestras do PGBR?

Att,
Fabiano Machado Dias
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] tutorial e dicas de explain analyze

2017-09-22 Por tôpico Uellinton Mendes

  
  
Bom Dia Luiz,
Já tentou usar essa ferramenta online?
  
  https://explain.depesz.com/
É muito legal.
Duvida, quantos registros tem mesmo em ned_nota_empenho_despesa e
  orcamentario_mensal?
Essas duas tabelas estão sem indices?


  
Uellinton Mendes
  
  11-9-9167-3524 [OI]
  

Em 22/09/2017 10:39, Luiz Henrique
  escreveu:


  

  

  

  Prezados,

  
  Procuro por links com tutorias aborando o "explain
  analyze". Como interpretar cada linha apresentada por
  ele. Alguém recomenda algum site ?


  
  Tenho uma consulta aqui com 1,5 minuto de duração e
  gostaria de tentar otimiza-la

Ao executar o explain analyze não entendi bem onde atuar
para melhorar

  
  Segue abaixo o sql e o explain. Toda ajuda será bem-vinda
  

### explain analyze

explain analyze select distinct npd.exercicio
  
    , npd.unidadegestora
  
    , npd.numero
  
    , npd.numeronld
  
    , nld.numero as nldorigem
  
    , nld.numeroned
  
    , ned.numero as nedorigem
  
    , ned.numeronpf
  
    , npf.numero as npforigem
  
    , npf.grupo_fin as grupofin  
  
    , orm.cod_tp_orcamento as tipcre
  
    , npd.classiforcamreduz
  
    , npd.classiforcamcompl
  
    , npd.credor
  
    , npd.nomecredor
  
    , npd.statusmovbancario
  
    , npd.natureza
  
    , nld.numeroned as numemp
  
    , npd.codigoretencao
  
    , npd.dataemissao
  
    , npd.dt_etl
  
    , npd.servicobancario
  
    , npd.bancobeneficiario as banco
  
    , npd.agenciabeneficiario as agencia
  
    , npd.contabeneficiario as conta
  
    , npd.efeito
  
    , substring(ned.classiforcamcompl from 24 for 8) as
  natdespesa
  
    , substring(ned.classiforcamcompl from 33 for 2) as
  fonterec
  
    , npd.valor as valor
  
    , npd.cpfcnpjcredor
  
    , cast(npd.numeronld as integer) as "numliq"
  
    , npd.numeronpf
  
    , npd.numeronpdordinario
  
    , exerciciorestosapagar
  
  from sefaz_ws.npd_nota_pagamento_despesa npd
  
  left join sefaz_ws.nld_nota_liquidacao_despesa nld
  
   on (npd.exercicio = nld.exercicio
  
   and npd.unidadegestora = nld.unidadegestora
  
   and npd.numeronld = nld.numero)
  
  left join sefaz_ws.ned_nota_empenho_despesa ned
  
   on (nld.exercicio = ned.exercicio
  
   and nld.unidadegestora = ned.unidadegestora
  
   and nld.numeroned = ned.numero)
  
  left join sefaz_ws.npf_nota_programacao_financeira npf
  
   on (ned.exercicio = npf.exercicio
  
   and ned.unidadegestora = npf.unidadegestora
  
   and ned.numeronpf = npf.numero)
  
  left join sefaz_ws.orcamentario_mensal orm
  
   on (npd.exercicio = orm.exercicio and npd.unidadegestora
  = orm.unidadegestora and orm.classif_orcam_reduz =
  CAST(ned.classiforcamreduz AS integer))
  
  order by npd.exercicio, npd.unidadegestora, npd.numero
  
   
   resultado do explain analyze
  
   
  "Unique  (cost=358689.48..389491.06 rows=352018 width=287)
  (actual time=101865.980..107098.130 rows=352018 loops=1)"
  
  "  ->  Sort  (cost=358689.48..359569.53 rows=352018
  width=287) (actual time=101865.979..103271.970 rows=2631834
  loops=1)"
  
  "    Sort Key: npd.exercicio, npd.unidadegestora,
  npd.numero, npd.numeronld, nld.numero, nld.numeroned,
  ned.numero, ned.numeronpf, npf.numero, npf.grupo_fin,
  orm.cod_tp_orcamento, npd.classiforcamreduz,
  npd.classiforcamcompl, npd.credor, npd.nomecredor,
  npd.statusmovbancario, npd.natureza, npd.codigoretencao,
  npd.dataemissao, npd.dt_etl, npd.servicobancario,
  

[pgbr-geral] tutorial e dicas de explain analyze

2017-09-22 Por tôpico Luiz Henrique
Prezados,

Procuro por links com tutorias aborando o "explain analyze". Como
interpretar cada linha apresentada por ele. Alguém recomenda algum site ?

Tenho uma consulta aqui com 1,5 minuto de duração e gostaria de tentar
otimiza-la
Ao executar o explain analyze não entendi bem onde atuar para melhorar

Segue abaixo o sql e o explain. Toda ajuda será bem-vinda

### explain analyze

explain analyze select distinct npd.exercicio
  , npd.unidadegestora
  , npd.numero
  , npd.numeronld
  , nld.numero as nldorigem
  , nld.numeroned
  , ned.numero as nedorigem
  , ned.numeronpf
  , npf.numero as npforigem
  , npf.grupo_fin as grupofin
  , orm.cod_tp_orcamento as tipcre
  , npd.classiforcamreduz
  , npd.classiforcamcompl
  , npd.credor
  , npd.nomecredor
  , npd.statusmovbancario
  , npd.natureza
  , nld.numeroned as numemp
  , npd.codigoretencao
  , npd.dataemissao
  , npd.dt_etl
  , npd.servicobancario
  , npd.bancobeneficiario as banco
  , npd.agenciabeneficiario as agencia
  , npd.contabeneficiario as conta
  , npd.efeito
  , substring(ned.classiforcamcompl from 24 for 8) as natdespesa
  , substring(ned.classiforcamcompl from 33 for 2) as fonterec
  , npd.valor as valor
  , npd.cpfcnpjcredor
  , cast(npd.numeronld as integer) as "numliq"
  , npd.numeronpf
  , npd.numeronpdordinario
  , exerciciorestosapagar
from sefaz_ws.npd_nota_pagamento_despesa npd
left join sefaz_ws.nld_nota_liquidacao_despesa nld
 on (npd.exercicio = nld.exercicio
 and npd.unidadegestora = nld.unidadegestora
 and npd.numeronld = nld.numero)
left join sefaz_ws.ned_nota_empenho_despesa ned
 on (nld.exercicio = ned.exercicio
 and nld.unidadegestora = ned.unidadegestora
 and nld.numeroned = ned.numero)
left join sefaz_ws.npf_nota_programacao_financeira npf
 on (ned.exercicio = npf.exercicio
 and ned.unidadegestora = npf.unidadegestora
 and ned.numeronpf = npf.numero)
left join sefaz_ws.orcamentario_mensal orm
 on (npd.exercicio = orm.exercicio and npd.unidadegestora =
orm.unidadegestora and orm.classif_orcam_reduz = CAST(ned.classiforcamreduz
AS integer))
order by npd.exercicio, npd.unidadegestora, npd.numero

 resultado do explain analyze

"Unique  (cost=358689.48..389491.06 rows=352018 width=287) (actual
time=101865.980..107098.130 rows=352018 loops=1)"
"  ->  Sort  (cost=358689.48..359569.53 rows=352018 width=287) (actual
time=101865.979..103271.970 rows=2631834 loops=1)"
"Sort Key: npd.exercicio, npd.unidadegestora, npd.numero,
npd.numeronld, nld.numero, nld.numeroned, ned.numero, ned.numeronpf,
npf.numero, npf.grupo_fin, orm.cod_tp_orcamento, npd.classiforcamreduz,
npd.classiforcamcompl, npd.credor, npd.nomecredor, npd.statusmovbancario,
npd.natureza, npd.codigoretencao, npd.dataemissao, npd.dt_etl,
npd.servicobancario, npd.bancobeneficiario, npd.agenciabeneficiario,
npd.contabeneficiario, npd.efeito,
("substring"((ned.classiforcamcompl)::text, 24, 8)),
("substring"((ned.classiforcamcompl)::text, 33, 2)), npd.valor,
npd.cpfcnpjcredor, npd.numeronpf, npd.numeronpdordinario,
nld.exerciciorestosapagar"
"Sort Method: external merge  Disk: 731704kB"
"->  Hash Left Join  (cost=104246.16..279334.81 rows=352018
width=287) (actual time=1322.332..6808.805 rows=2631834 loops=1)"
"  Hash Cond: ((npd.exercicio = orm.exercicio) AND
(npd.unidadegestora = orm.unidadegestora) AND
((ned.classiforcamreduz)::integer = orm.classif_orcam_reduz))"
"  ->  Merge Left Join  (cost=100158.37..188918.69 rows=352018
width=290) (actual time=1295.093..3653.514 rows=352018 loops=1)"
"Merge Cond: ((npd.unidadegestora = nld.unidadegestora)
AND (npd.exercicio = nld.exercicio) AND (npd.numeronld = nld.numero))"
"->  Index Scan using
npd_nota_pagamento_despesa_idx_gestora_exercicio_numeronld on
npd_nota_pagamento_despesa npd  (cost=0.00..82171.24 rows=352018 width=215)
(actual time=0.009..1846.104 rows=352018 loops=1)"
"->  Sort  (cost=100158.37..100655.53 rows=198865
width=83) (actual time=1295.075..1355.207 rows=364791 loops=1)"
"  Sort Key: nld.unidadegestora, nld.exercicio,
nld.numero"
"  Sort Method: quicksort  Memory: 32689kB"
"  ->  Merge Left Join  (cost=54937.60..82656.83
rows=198865 width=83) (actual time=749.878..980.454 rows=198865 loops=1)"
"Merge Cond: ((nld.unidadegestora =
ned.unidadegestora) AND (nld.exercicio = ned.exercicio) AND (nld.numeroned
= ned.numero))"
"->  Index Scan using
nld_nota_liquidacao_despesa_idx_gestora_exercicio_numeroned on
nld_nota_liquidacao_despesa nld  (cost=0.00..23405.46 rows=198865 width=21)
(actual time=0.008..77.818 rows=198865 loops=1)"
"->  Sort  (cost=54937.55..55372.62