Re: [pgbr-geral] Desempenho de índices

2016-03-13 Por tôpico Matheus de Oliveira
2016-03-11 16:31 GMT-03:00 Danilo Silva :

> 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

Re: [pgbr-geral] Desempenho de índices

2016-03-12 Por tôpico Tiago José Adami
Em 11 de março de 2016 16:46, Vinícius Aquino do Vale
 escreveu:
> Olá Danilo,
>
> Existe diferenças sim.
>
> Dê uma olhada neste post, para entender melhor a situação e o uso de índices
> compostos.

Este artigo que o Vinicius lhe recomendou já poderá lhe dar uma boa
ideia de como funciona o SGBD em relação aos índices.

Pode haver diferenças de desempenho significativas entre uma forma e
outra (me referindo ao tipos descritos pelo OP). Cito 3 principais
itens que interferem no desempenho dos índices:

1) a quantidade de distinções de um campo em relação às linhas. Em
outras palavras, quantas vezes o valor muda ao longo de todos os
registros;
2) a ordem dos campos no índice:  (campo1,campo2) ou (campo2,campo1);
3) as colunas utilizadas na consulta SQL. Se apenas os campos do
índice estiverem em uma consulta o acesso será "index only", sem a
necessidade de fazer um fetch adicional nos dados da tabela. Em alguns
casos é recomendável incluir um campo no índice - no final da lista de
colunas - para proporcionar um acesso "index only".

Bônus:

Já ia me esquecendo da clausula WHERE [1] nos índices do PostgreSQL,
que é fantástica! Nela você pode definir um predicado de consulta
específico que o PostgreSQL trata de forma indexada. Em determinadas
situações isto pode salvar vidas! :)

[1] http://www.postgresql.org/docs/current/static/sql-createindex.html

TIAGO J. ADAMI
http://www.adamiworks.com
@tiadami
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Desempenho de índices

2016-03-11 Por tôpico Vinícius Aquino do Vale
Olá Danilo,

Existe diferenças sim.

Dê uma olhada neste post, para entender melhor a situação e o uso de
índices compostos.


Indices Compostos


Em sex, 11 de mar de 2016 às 16:32, Danilo Silva 
escreveu:

> Pessoal,
>
> 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);
>
> Ambas as formas terão o mesmo desempenho?
>
> []s
> Danilo
> ___
> 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

[pgbr-geral] Desempenho de índices

2016-03-11 Por tôpico Danilo Silva
Pessoal,

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);

Ambas as formas terão o mesmo desempenho?

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