2015-03-05 10:28 GMT-03:00 Fernando Cambiaghi <[email protected]>:

> Ao executar a seguinte consulta :
>
>      SELECT max( cd_cliente ) FROM cliente WHERE cd_filial_inclusao = 563
>
> O resultado do plano de acesso é o seguinte:
>
> ____________________________________________________________________________________
> Result  (cost=29.31..29.32 rows=1 width=0) (actual
> time=291588.847..291588.847 rows=1 loops=1)
>   Output: $0
>   Buffers: shared hit=323106 read=1181788
>   InitPlan 1 (returns $0)
>     ->  Limit  (cost=0.43..29.31 rows=1 width=12) (actual
> time=291588.840..291588.840 rows=1 loops=1)
> ...
>           ->  Index Scan Backward using pk_cliente on cliente
>  (cost=0.43..377539.21 rows=13071 width=12) (actual
> time=291588.837..291588.837 rows=1 loops=1)
> ...
> Execution time: 291588.916 ms
>
> 1 rows returned (execution time: 11,466 sec; total time: 11,498 sec)
>
> ____________________________________________________________________________________
>
> A tabela em questão ( cliente ), tem 2.435.230 linhas com 341 (
> cd_filial_inclusao ) diferentes.
> Um dos índices da tabela é composto por cd_filial_inclusao, dh_inclusao.
>
> ____________________________________________________________________________________
> CREATE INDEX idx_cliente_inclusao ON cliente
>   USING btree (cd_filial_inclusao, dh_inclusao);
>
> ____________________________________________________________________________________
>
> Neste caso a consulta não deveria utilizar o índice acima para realizar a
> busca? Pois até onde tenho conhecimento, ainda que um índice seja composto,
> se eu utilizar as colunas na ordem do índice na cláusula where, ainda que
> não utilize todas as colunas que compõe o índice, a busca deveria utilizar
> ele.
>

Esse índice poderia sim ser usado, mas aí o PostgreSQL deveria fazer uma
operação de ordenação (Sort) após a filtragem dos registros. No caso foi
escolhido o índice (PK) em cd_cliente exatamente para evitar a ordenação,
assim usa o índice para trazer os maiores valores (para aplicar no max) e
filtra "cd_filial_inclusao" pela tabela.

Para sua consulta, o índice ideal seria:

    CREATE INDEX ON cliente (cd_filial_inclusao, cd_cliente);

Assim é possível buscar rapidamente o "cd_filial_inclusao" pelo número
exato e então só pegar o último elemento, com maior "cd_cliente".

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