Estou usando Postgre 9.5. Eu quero criar índices que farão consultas como
select * FROM my_object_times where name like ‘Dave %’;
e
select * FROM my_object_times where name like '% LastName';
corra rápido. Então eu criei…
CREATE INDEX my_object_times_name_idx ON my_object_times (name text_pattern_ops);
CREATE INDEX my_object_times_rev_name_idx ON my_object_times (reverse(name) text_pattern_ops);
Isso funciona bem para o primeiro caso, em que posso ver meu índice sendo usado, mas no segundo caso, “Explicar” não mostra meu índice sendo utilizado…
my_db=> explain select * FROM my_object_times where name like '% LastName';
QUERY PLAN
------------------------------------------------------------------
Seq Scan on my_object_times (cost=0.00..136594.69 rows=51 width=221)
Filter: ((name)::text ~~ '% LastName'::text)
Como faço para que meu índice seja usado no segundo caso?
Responda, porque você não está invertendo na consulta, e isso não está implícito.
No entanto, essa é uma ideia horrível. Em vez disso, exclua esses dois índices. Se você precisar ter correspondência não ancorada em algo como "LastName", tente a extensão pgtrgm, que funcionará apenas em
LIKE
e%
. Conte-nos como foi.Instalar pg_trgm,
Crie um índice gist ou gin.
Veja esta postagem no blog sobre depesz para obter mais informações.
Por que dois é
text_pattern_ops
uma ideia inferior,text_pattern_ops
nunca apoiarão'%foo%'
reverse()
de todas as condições.{LastName: { $like: '% LastName' } }
É improvável que isso vá gerar,reverse(LastName) LIKE reverse('% LastName')
. Portanto, o índice simplesmente não será usado, a menos que você o escreva manualmente: na melhor das hipóteses, isso ofuscará o uso de uma ferramenta de terceiros; na pior, será impossível ou muito difícil de fazer funcionar. Onde como apg_trgm
opção simplesmente funciona.Além disso, como outra observação, se o tamanho diminuir, você sempre poderá obter outro disco rígido, configurá-lo como um
TABLESPACE
e armazenar o índice GIST lá. Isso não resolve o problema de /space/, mas deve mitigá-lo.