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
