Tem algumas coisas que podem ser melhoradas só olhando nesse plano. Mas
acho melhor ir eliminando uma por vez. Aqui vai uma:

On Wed, Jul 9, 2014 at 2:30 PM, Bruno Silva <[email protected]> wrote:

>                      ->  Index Scan using ix_movimentacao_04 on
> movimentacao movjulg  (cost=0.56..52676472.59 rows=16518832 width=16)
> (actual time=359.452..39891.966 rows=216 loops=1)
>                            Index Cond: (dtamovimento <= '2013-12-31
> 23:59:59'::timestamp without time zone)
>                            Filter: ((bolcancelado)::text <> 'S'::text)
>                            Rows Removed by Filter: 195962
>                            Buffers: shared hit=11589 read=19548
>                            I/O Timings: read=39666.394
>

Nesse ponto, me parece que um índice parcial ajudaria muito. Se a consulta
sempre usar `bolcancelado <> 'S'`, você pode criar o seguinte índice:

    CREATE INDEX ... ON movimentacao(dtamovimento) WHERE bolcancelado <> 'S'

É possível também algumas melhorias alterando a consulta. Provavelmente
adicionando um LIMIT 20 (que parece ter na parte de fora) na consulta à
movimentacao, e o colocando em uma CTE ajudaria bastante (assumindo que
acertei quanto ao LIMIT). Me parece que essa tabela está particionada, mas
a chave não é usada nessa consulta. Talvez um segundo nível de
particionamento por data seja interessante, mas eu deixaria isso para
depois (dada a complicação e as melhorias que ainda podem ser exploradas
sem isso).

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a