PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe uma maneira útil de indexar uma coluna de texto contendo padrões regex?


Não há nenhuma maneira .

Índices requerem IMMUTABLE expressões. O resultado da sua expressão depende da string de entrada. Não vejo outra maneira de avaliar a expressão para cada linha, ou seja, uma varredura sequencial.

Resposta relacionada com mais detalhes para o IMMUTABLE ângulo:

Só que não há solução para o seu caso, o que é impossível para indexar. O índice precisa armazenar valores constantes em suas tuplas, o que simplesmente não está disponível porque o valor resultante para cada linha é calculado com base na entrada. E você não pode transformar a entrada sem olhar para o valor da coluna.

O uso do índice Postgres está vinculado a operadores e apenas índices em expressões esquerda do operador pode ser usado (devido às mesmas restrições lógicas). Mais:

Muitos operadores definem um
COMMUTATOR que permite que o planejador/otimizador de consultas inverta as expressões indexadas para a esquerda. Exemplo simples:o comutador de = é = . o comutador de > é < e vice versa. A documentação:

O operador de correspondência de expressão regular ~ não tem comutador, novamente, porque isso não é possível. Veja por si mesmo:
SELECT oprname, oprright::regtype, oprleft::regtype, oprcom
FROM   pg_operator
WHERE  oprname = '~'
AND    'text'::regtype IN (oprright, oprleft);

 oprname | oprright |  oprleft  | oprcom
---------+----------+-----------+------------
 ~       | text     | name      | 0
 ~       | text     | text      | 0
 ~       | text     | character | 0
 ~       | text     | citext    | 0

E consulte o manual aqui:

Eu tentei antes e tive que aceitar que é impossível em princípio .