PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il un moyen d'indexer utilement une colonne de texte contenant des modèles regex ?

Il n'y a aucun moyen .

Les index nécessitent IMMUTABLE expressions. Le résultat de votre expression dépend de la chaîne d'entrée. Je ne vois pas d'autre moyen que d'évaluer l'expression pour chaque ligne, ce qui signifie une analyse séquentielle.

Réponse connexe avec plus de détails pour le IMMUTABLE angle :

Juste qu'il n'y a pas de solution de contournement pour votre cas, ce qui est impossible indexer. L'index doit stocker des valeurs constantes dans ses tuples, ce qui n'est tout simplement pas disponible car la valeur résultante pour chaque ligne est calculée en fonction de l'entrée. Et vous ne pouvez pas transformer l'entrée sans regarder la valeur de la colonne.

L'utilisation de l'index Postgres est liée aux opérateurs et n'indexe que sur les expressions left de l'opérateur peut être utilisé (en raison des mêmes contraintes logiques). Plus :

De nombreux opérateurs définissent un COMMUTATOR qui permet au planificateur/optimiseur de requêtes de retourner les expressions indexées vers la gauche. Exemple simple :le commutateur de = est = . le commutateur de > est < et vice versa. La documentation :

L'opérateur de correspondance d'expression régulière ~ n'a pas de commutateur, encore une fois, parce que ce n'est pas possible. Voyez par vous-même :

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

Et consultez le manuel ici :

J'ai déjà essayé et j'ai dû accepter que c'est impossible sur le principe .