Bruno

Como esse servidor tem "razoavel" memória, acredito que o Otimizador do
SGBD ache mais barato resolver a query em memória do que utilizar
índice. Outro fato que acredito nisso, é que a memória é maior que a
maior tabela (16gb).

O otimizador só vai achar isso se estiver configurado para tal, configuração effective_cache_size.

Se fosse no Oracle, iria te falar para por um HINT para forçar o
Otimizador a utilizar o índice, mas no postgresql nao sei se aceita
Hints. Outra coisa que poderia fazer é filtrar primeiro os predicados

Não, o PostgreSQL não aceita hints e nunca aceitará. É um erro achar que hints são uma solução para esse tipo de problemas, normalmente eles causam mais problemas do que resolvem. Nem sempre usar um índice é o melhor caminho para uma consulta e isso varia com o volume das tabelas envolvidas.

mais restritivos através de alias de tabela +- como abaixo, assim na
hora da junção teria menos dados para fazer os Hash Join ou Nested Loop:

SELECT *
FROM C1,
( SELECT * FROM C2 WHERE FILTRO = QUALQUER ) C2A
WHERE
       ....

Você olhou a consulta do colega antes de dizer isso?


    Boa noite, estou fazendo análise de uma consulta e ela está
    extremamente lenta. Não consigo entender o motivo.
    Fazendo alguns testes vi que precisava de alguns índices e os criei,
    porém o Postgres não está utilizando eles.
    Esse [1] é o resultado do analyze da consulta[2] já com os índices
    criados.
    Já atualizei as estatísticas e nada.
    Os parâmetros dessa máquina são:
    work_mem=2GB
    shared_buffers=3GB
    effective_cache_size=16GB

Aqui está o effective_cache_size que o outro colega não viu (afinal com top posting é difícil mesmo separar tudo).

    temp_buffers=1GB

Muito. Diminua isso. Não faz sentido e só ocupa espaço do seu shared_buffers. Uns 8MB tá de bom tamanho.


    A máquina tem 96GB de RAM, é um Intel(R) Xeon(R) CPU X5680  @
    3.33GHz, com 24 cores e tem tablespace separadas pros índices e a
    maior tabela ( movimentacao  - 16GB ) está em outro tablespace também.

    [1] http://explain.depesz.com/s/fAjE
    [2] http://pastebin.com/rJVUBVp0

A parte mais cara da sua consulta, de acordo com o explain, é:

WHERE (movjulg.bolcancelado IS FALSE
                 AND movjulg.dtamovimento <= '2013-12-31 23:59:59-03')

Poderia verificar se existem índices nessas colunas? caso haja, a distribuição estatística dos dados nelas pode afetar o plano também. Mostre-nos mais detalhes, por favor, dessa tabela e essas colunas.

[]s
Flavio Gurgel
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a