Estou usando Postgresql 9.1 com extensão *pg_trgm*. Eu preciso criar um índice em um campo baseado em texto. Não preciso de pesquisas de texto completo, uso ILIKE
consultas para fazer minhas pesquisas.
Vou usar, pg_trgm
mas não tenho muita experiência com índices gin
e . gist
Terei muitas INSERT
declarações (~15.000 diariamente) e muito poucas UPDATE
declarações (pode ser 1 ou 2 em uma semana).
Qual será a sobrecarga de atualização de índice para um gin
índice em tal tabela? Ou é gist
mais adequado?
O manual do módulo pg_trgm tem alguns conselhos para sua pergunta aqui :
O
FASTUPDATE
recurso de índices GIN (introduzido no Postgres 8.4, ON por padrão) deve ser interessante para você. INSERTs (e UPDATEs) são armazenados em uma lista pendente e integrados ao índice em operações em massa posteriores porVACUUM
. Torna essas operações muito mais rápidas, já que a manutenção direta do GIN tende a ser cara, principalmente para colunas com muitos elementos indexáveis, ou seja, muitas palavras no seu caso.Mais conselhos básicos sobre GIN vs GiST no manual aqui.
Em particular, se suas linhas forem grandes e você inserir em grandes quantidades, convém aumentar a
work_mem
configuração .Para cargas muito grandes (grandes partes da tabela), pode valer a pena descartar o índice e recriá-lo posteriormente.
Embora 15 mil linhas espalhadas por um dia não devam ser um problema.
Por fim, há um capítulo inteiro sobre o desempenho do GIN e do GiST na seção Pesquisa de Texto Completo. Aplica-se geralmente. Leia isso.
A essência disso (sem trocadilhos): GIN é consideravelmente maior e mais caro para manter, mas mais rápido para a maioria das pesquisas ( exceções especiais se aplicam a pg_trgm ). Uma vez que a adição de
FASTUPDATE
gravações é apenas moderadamente mais cara.