Der er ingen måde .
Indekser kræver IMMUTABLE
udtryk. Resultatet af dit udtryk afhænger af inputstrengen. Jeg kan ikke se nogen anden måde end at evaluere udtrykket for hver række, hvilket betyder en sekventiel scanning.
Relateret svar med flere detaljer for IMMUTABLE
vinkel:
Bare at der ikke er nogen løsning for din sag, hvilket er umuligt at indeksere. Indekset skal gemme konstante værdier i sine tuples, hvilket bare ikke er tilgængeligt, fordi den resulterende værdi for hver række beregnes baseret på inputtet. Og du kan ikke transformere inputtet uden at se på kolonneværdien.
Postgres indeksbrug er bundet til operatorer og kun indekser på udtryk venstre af operatøren kan bruges (på grund af de samme logiske begrænsninger). Mere:
Mange operatører definerer en COMMUTATOR
som tillader forespørgselsplanlæggeren/optimeringsværktøjet at vende de indekserede udtryk til venstre. Simpelt eksempel:Kommutatoren for =
er =
. kommutatoren for >
er <
og omvendt. Dokumentationen:
Det regulære udtryk matchoperator ~
har ingen kommutator igen, for det er ikke muligt. Se selv:
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
Jeg har prøvet før og måtte acceptere, at det er umuligt af princippet .