Boa tarde.

Tenho uma tabela com 2.824.756 registros. É uma tabela com dados cadastrais
de pessoas físicas e jurídicas.
Realizei uma consulta na estatística de utilização dos índices

SELECT idx_scan, indexrelname FROM pg_stat_user_indexes WHERE relname =
'cliente';
215072;  "pk_cliente"
14;         "idx_cliente_inclusao"
14;         "idx_filial_data_atualizacao"
9;           "idx_nr_cpf_cgc"
0;           "idx_rg"
0;           "idx_nm_cliente"

Estranhei a não utilização do índice idx_nm_cliente, pois nas aplicações é
muito comum o usuário informar parte do nome para realizar a busca, ficando
algo do tipo
SELECT * FROM cliente WHERE nm_cliente LIKE 'FERNANDO LUIS CAMB%';

Realizei um EXPLAIN da consulta acima e o resultado foi
"Seq Scan on cliente  (cost=0.00..137044.45 rows=280 width=347)"
"  Filter: ((nm_cliente)::text ~~ 'FERNANDO LUIS CAMB%'::text)"

Com isso, saí na caça de uma explicação e encontrei uma que diz que para
campos tipo texto, o tipo da classe de operação deve ser definido na
criação do índice. Algo como CREATE INDEX idx_nm_cliente ON cliente
(nm_cliente varchar_pattern_ops);

Após a criação do índice com o comando acima, o resultado do EXPLAIN foi
"Index Scan using idx_nm_cliente on cliente  (cost=0.43..8.45 rows=280
width=347)"
"  Index Cond: (((nm_cliente)::text ~>=~ 'FERNANDO LUIS CAMB'::text) AND
((nm_cliente)::text ~<~ 'FERNANDO LUIS CAMC'::text))"
"  Filter: ((nm_cliente)::text ~~ 'FERNANDO LUIS CAMB%'::text)"

Com isso eu gostaria de saber se essa é a única e/ou melhor solução para o
índice de colunas tipo varchar onde a busca é realizada frequentemente com
LIKE? Caso não, qual outra opção poderia ser aplicada?

SO: Windows 7
PostgreSQL 9.4.1, compiled by Visual C++ build 1800, 32-bit

Agradeço desde já a atenção.

Fernando Luís Cambiaghi
*[email protected] <[email protected]>*
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a