Estou trabalhando no Postgres 9.4. Eu tenho uma tabela e um índice assim:
Table "public.title"
Column | Type | Modifiers
---------------------------------+-------------------------+----------------------------------------------------
id | integer | not null default nextval('title_id_seq'::regclass)
pty_addr | character varying(1000) | not null
Eu tenho um índice GIN na pty_addr
coluna:
"title_pty_add_15f367_gin" gin (pty_addr)
Minha consulta é esta:
EXPLAIN ANALYZE SELECT * FROM "title" WHERE pty_addr LIKE '%FOO%';
Esta consulta está realizando uma varredura sequencial, levando 1,2 segundos:
QUERY PLAN
---------------------------------------------------------------------------------------------------------------
Seq Scan on title (cost=0.00..193271.60 rows=599 width=4446) (actual time=1.191..1220.640 rows=7945 loops=1)
Filter: ((pty_addr)::text ~~ '%FOO%'::text)
Rows Removed by Filter: 3592055
Planning time: 0.330 ms
Execution time: 1220.992 ms
Por que essa consulta não está usando o índice?
Se você deseja indexar para LIKE que não são consultas de prefixo, ou para consultas ILIKE, você deve procurar na extensão pg_trgm , fornecendo um índice que se parece com:
Além disso, houve melhorias substanciais desde 9.4. Você estará fazendo um favor a si mesmo ao atualizar para pelo menos 9.6.