2016-03-11 16:31 GMT-03:00 Danilo Silva <danilo.dsg.go...@gmail.com>:

> Existe diferença entre criar índices assim:
> CREATE INDEX foo_c1_idx ON foo (campo1);
> CREATE INDEX foo_c2_idx ON foo (campo2);
>
> ou assim:
> CREATE INDEX foo_idx ON foo (campo1,campo2);
>

Tem sim, o artigo do Vinícius explica bem, mas vou resumir nos termos da
questão e com exemplo:

1. O índice `foo_c1_idx` poderia ser usado de forma ótima para consultas
`WHERE campo1  = $1` mas não para `WHERE campo2 = $1`
2. O índice `foo_c2_idx` é o oposto, ótimo para `WHERE campo2 = $1` mas não
para `WHERE campo1 = $1`
3. Se você tiver somente `foo_c1_idx` e `foo_c2_idx' e a consulta `WHERE
campo1 = $1 AND campo2 = $2`, o PostgreSQL pode escolher por usar apenas um
dos índices (daí considera somente campo1 ou campo2 e filtra o outro campo
na tabela), o que pode ser suficientemente bom caso seja bem seletivo.
4. Ainda é possível usar ambos para `WHERE campo1 = $1 AND campo2 = $2` com
BitmapAnd (veja [1] depois), mas não é tão eficiente quanto se tivesse o
`foo_idx`, ou seja, para `WHERE campo1 = $1 AND campo2 = $2`, o `foo_idx` é
certamente o ideal (também é ideal para outros casos, como `WHERE campo1 =
$1 ORDER BY campo2` ou `GROUP BY campo1, campo2`, etc.).
5. Supomos que você tenha apenas o `foo_idx`, como o índice inicia com
`campo1`, é possível usá-lo de forma ótima para `WHERE campo1 = $1` mas não
para `WHERE campo2 = $1`. Ter `foo_idx` e `foo_c1_idx` é geralmente
redundante (exceção seria se `foo_idx` fosse *muito* maior que
`foo_c1_idx`), então é comum ter `foo_c2_idx` e `foo_idx`, mas *NÃO* ter
`foo_c1_idx` (pois seu uso ideal já é contemplado pelo `foo_idx`).

Sobre o uso de índices compostos o artigo do Vinícius é bem legal, eu
queria só complementar com um meu que também comenta sobre o uso de
múltiplos índices, que citei em (4), leia em [1].

[1]
http://dextra.com.br/como-o-postgresql-usa-multiplos-indices-na-mesma-consulta/

Atenciosamente,
-- 
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a