Hoje, sete bancos de dados em sete semanas me apresentaram os índices por operador.
Você pode indexar seqüências de caracteres para o padrão que corresponde às consultas anteriores, criando um
text_pattern_ops
índice de classe do operador, desde que os valores sejam indexados em minúsculas.
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Usamos o
text_pattern_ops
porque o título é do tipo texto. Se você precisar índice VARCHAR, caracteres, ou nomes, use os ops relacionados:varchar_pattern_ops
,bpchar_pattern_ops
, ename_pattern_ops
.
Acho o exemplo realmente confuso. Por que é útil fazer isso?
Se a coluna for do tipo texto, os outros tipos (varchar, char, name) não serão convertidos em texto antes de serem usados como um valor de pesquisa?
Como esse índice se comporta de maneira diferente de um usando o operador padrão?
CREATE INDEX moves_title_pattern ON movies (lower(title));
fonte
Respostas:
A documentação geralmente fornece uma resposta para essas perguntas. Como também neste caso :
A documentação continua dizendo:
Você pode verificar seu código do idioma da seguinte maneira (é provável que seja UTF8 em vez de "C"):
fonte
text_pattern_ops
depende da localidade? Parece que me beneficiaria porque meu código de idioma é 'en_US.UTF-8' (não 'C'), portanto, as consultas padrão não podem usar o índice padrão.LIKE
consulta usando um índice b-tree simples, o banco de dados deve estar usando oC
código de idioma. Ou o índice é definido com oCOLLATE "POSIX"
(ouCOLLATE "C"
) e a consulta especifica uma correspondênciaCOLLATION
. Com qualquer outro agrupamento, a ordem do índice não corresponde às regras de localidade e, portanto, não pode ser usada para correspondência de padrões.