junior Prado escreveu:
> Galera,
> 
> Na site do postgres http://www.postgresql.org.br/Documentação
> encontrei um material sobre indice
> * Tutorial de Tsearch - Indexando textos no PostgreSQL - Baixar o PDF
> 
> No inicio do texto
> "As vezes é necessário criar aplicações que buscam dados de acordo com
> palavras contidas em textos extensos. No entanto a procura de padrões
> em grandes cadeias de caracteres é extremamente custosa em termos
> computacionais. Uma das soluções para esse problema comum é quebrar os
> textos em átomos maiores que um caractere, ou seja, utilizar
> palavras-chave para indexar. O uso de palavras-chave reduz
> consideravelmente o número de elementos distintos a serem indexados,
> além de possibilitar algoritmos muito mais eficientes para a busca.
> Torna-se possível utilizar uma estrutura de dados que organize todas
> as palavras contidas em um texto em um formato que possa ser
> facilmente percorrido: uma árvore. Outra vantagem na utilização de
> palavras-chave é que elas possuem, diferentemente de meras cadeias de
> caracteres, um significado. Isso pode ser utilizado para criar
> ordenamentos baseados em relevâncias de palavras em um determinado
> contexto. Um ótimo exemplo disso são os sites de busca na web, que
> procuram por palavras-chave presentes em imensas bases de dados
> contendo documentos."
> 
> Concluindo,  os índices com tipos numéricos são mais rápidos...
> Alguém nega minha afirmação?Me dê uma prova?


        Não misture as coisas, uma coisa é a pesquisa verificando se um campo é 
igual a um valor dado. Outra coisa completamente diferente é a 
utilização do módulo tsearch que serve para saber se uma ou várias 
palavras *estão contidas* em um texto. Esta última sim, é muito custosa.

Prova:

teste=# create table teste(codint integer, codstr varchar(10));
CREATE TABLE
teste=# create index teste_idx1 on teste(codint);
CREATE INDEX
teste=# create index teste_idx2 on teste(codstr);
CREATE INDEX
teste=# \d teste
              Tabela "public.teste"
  Coluna |         Tipo          | Modificadores
--------+-----------------------+---------------
  codint | integer               |
  codstr | character varying(10) |
Índices:
     "teste_idx1" btree (codint)
     "teste_idx2" btree (codstr)

Preenchi o banco com 1,5 milhões de registros com valores totalmente 
diferentes e vejamos os resultados

teste=# explain select * from teste where codint = 1;
                                QUERY PLAN
------------------------------------------------------------------------
  Index Scan using teste_idx1 on teste  (cost=0.00..8.27 rows=1 width=8)
    Index Cond: (codint = 1)
(2 registros)

teste=# explain select * from teste where codstr = '1';
                                QUERY PLAN
------------------------------------------------------------------------
  Index Scan using teste_idx2 on teste  (cost=0.00..8.27 rows=1 width=8)
    Index Cond: ((codstr)::text = '1'::text)
(2 registros)

teste=#

        Portanto, não confunda tsearch que trata de full text index com índices 
btree. No segundo tipo, em consulta a diferença é mínima, o problema é 
na atualização que o índice de campos numéricos é mais rápido. Até 
porque é mais fácil ordenar números do que cadeias de caracteres.

        Abraço,

--
Shander Lyrio



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

Responder a