Em 19 de agosto de 2015 12:28, Gerdan Rezende dos Santos
<[email protected]> escreveu:
> Pessoal, não entendo muito claramente como funcionam os índices GIN e GIST
> alguém tem uma referencia boa???
> Li o o manual mas não ficou muito claro...
Não sei exatamente "o quê" você deseja saber sobre eles, então sendo
um pouco genérico, poderiamos resumir que:
Basicamente temos indices B-tree que permitem que você busque
registros comparando se A é igual ou não a B, ou se A é menor/maior ou
não a B.
Vocẽ também tem indices do tipo hash, que só te permitem buscar
registros comparando se A é igual a B.
O GiST, por sua vez, generalizou mais a busca na árvore, permitindo
que você implemente indices que não sejam só um B-tree mas que possa
indexar outros tipos complexos como B+-tree, R-tree, etc também de
forma balanceada, mas de um modo que a chave não possua as restrições
do B-tree. Com o GIST voce pode usar algum operador especifico ja
implementado ou implementar um indice (codificando "na unha" em C) com
um tipo específico seu. Divagando um pouco, pense num jogo de
asteroides, imagine que de alguma forma você está armazenando no banco
poligonos que represente o contorno deles e deseja saber quais
asteroides estão colidindo com a sua nave, isso vai te remeter a uma
inevitável comparação entre as bordas destes poligonos, que estão ali,
armazenados em seu banco, mas não são simples inteiros, são eles dados
complexos que precisam ser comparados entre si de uma forma diferente
do que voce compara WHERE "1 < 2". O GIST te ajuda nisto e suas
chaves internas que apontam para as estruturas são baseadas em uma
tabela hash o que faz com que ele possa ser mais lento em condições
que uma mesma chave contenha vários possíveis resultados, caso este em
que os registros selecionados pré-selecionados são re-testados.
O GIN, por sua vez não se baseia em hash, se baseia em B-tree e
permite voce implementar metodos de acesso para buscar dados dentro de
uma estrutura composta. Pense num JSON, algo como '{ "nome": "Joao"
}', considere-o uma estrutura complexa e imagina como selecionar todas
as linhas de uma tabela cujo um determinado campo do tipo JSON contem
uma chave chamada 'nome' cujo conteudo é "Joao". Isto é muito
diferente do que procurar por Joao com um LIKE, do tipo "campo_json
LIKE '%Joao%'" e é importante que, se voce tem uma estrutura definida
em um tipo composto, e tem operadores bem definidos que permitem voce
fazer comparações nestes tipos, use-os para o bem da humanidade.
Enfim, paro por aqui porque posso estar mentindo demais e afinal era
para ser apenas um resumo.
[]s
--
Dickson S. Guedes
mail/xmpp: [email protected] - skype: guediz
http://github.com/guedes - http://guedesoft.net
http://www.postgresql.org.br
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral