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
J'ai déjà essayé et j'ai dû accepter que c'est impossible sur le principe .